参考文档

Fetcher

GitHub、Git、Hugging Face、URL 和归档 Fetcher 的字段与版本映射。

Fetcher 使用 Checker 已选出的 Version,得到内容和源码 Hash。Version 在 Pins File 中保持原样;rev 或 url 映射只改变获取参数。

通用规则

  • rev、url 映射必须是从 Version 到字符串的 Nix 函数。
  • target 与对应旧字段不能混用。
  • fetcherArgs 是传给 Nixpkgs Fetcher 的额外属性集;不能覆盖工具管理的目标、版本映射和哈希字段。
  • 不手写 hash。它由 update 计算并由 Reader 注入。

GitHub:pin.fetcher.github

目标为 target = "owner/repo",或 owner 与 repo。rev 默认 version: version;底层使用 pkgs.fetchFromGitHub。

{ pin }: {
  example = pin.mk {
    checker = pin.checker.cmd "printf '0.18.0'";
    fetcher = pin.fetcher.github {
      target = "NixOS/patchelf";
      rev = version: version;
    };
  };
}

fetcherArgs 不得覆盖 owner、repo、rev、hash。如果版本不带 v,而上游 tag 使用 v,可以设置 rev = version: "v${version}";先确认上游命名规则。

Git:pin.fetcher.git

目标为 target 或 url,rev 默认直接使用 Version。底层使用 pkgs.fetchgit,可通过 fetcherArgs 配置 fetchSubmodules 等参数。

{ pin }: {
  example = pin.mk {
    checker = pin.checker.git { target = "https://github.com/NixOS/patchelf.git"; };
    fetcher = pin.fetcher.git {
      target = "https://github.com/NixOS/patchelf.git";
      fetcherArgs.fetchSubmodules = true;
    };
  };
}

保留字段为 url、rev、hash。

Hugging Face:pin.fetcher.huggingface

目标为 target 或 repoId,值为仓库标识。rev 默认直接使用 Version;底层使用 pkgs.fetchFromHuggingFace,默认 backend 为 lfs。所用 Nixpkgs 必须提供该 Fetcher。

{ pin }: {
  model = pin.mk {
    checker = pin.checker.git {
      target = "https://huggingface.co/bert-base-uncased";
    };
    fetcher = pin.fetcher.huggingface { target = "bert-base-uncased"; };
  };
}

仓库内容可能包含大模型权重;实际下载前确认容量和访问要求。保留字段为 repoId、rev、tag、hash。

文件:pin.fetcher.url

必需 url = version: "...",底层使用 pkgs.fetchurl。target 是同一字段的别名,也必须提供映射函数。下载内容按文件保存,不解压。

{ pin }: {
  example = pin.mk {
    checker = pin.checker.cmd "printf '0.18.0'";
    fetcher = pin.fetcher.url {
      url = version: "https://github.com/NixOS/patchelf/archive/refs/tags/${version}.tar.gz";
    };
  };
}

归档:pin.fetcher.zip

字段与 url 相同,底层使用 pkgs.fetchzip。名称为 zip,也可解压 Nixpkgs 支持的 tar 等归档,并计算解压结果的哈希。

{ pin }: {
  example = pin.mk {
    checker = pin.checker.cmd "printf '0.18.0'";
    fetcher = pin.fetcher.zip {
      url = version: "https://github.com/NixOS/patchelf/archive/refs/tags/${version}.tar.gz";
      fetcherArgs.stripRoot = true;
    };
  };
}

url 与 zip 的保留字段均为 url、hash。从文件 Fetcher 改为归档 Fetcher 会改变哈希对应的内容,需重新执行 update。