参考文档

Checker

全部内置版本检查器的参数、版本选择规则与示例。

Checker 只决定 Pin 的 Version。获取源码由 Fetcher负责。除 cmd 外,下面的构造器接收属性集;它们不直接接收 pin.github 那种字符串简写。

GitHub:pin.checker.github

参数为 target = "owner/repo",或 owner 与 repo。不能混用。读取 GitHub 的 /releases/latest,使用 tag_name 的原始字符串;这与按 Git tag 排序不同。

{ pin }: {
  patchelf = pin.mk {
    checker = pin.checker.github { target = "NixOS/patchelf"; };
    fetcher = pin.fetcher.github { target = "NixOS/patchelf"; };
  };
}

Git:pin.checker.git

目标为 target 或 url,二者不能混用。支持:

mode额外字段Version
head(默认)无HEAD 提交号
branch必需 branch分支提交号
ref必需 ref指定 ref 对应提交号;优先解析注解 tag 的 peeled commit
tag可选 include、exclude、sort排序后的原始 tag

include 与 exclude 是 Rust 正则,过滤 tag 名。sort 默认 semver,还可使用 lexicographic。不要用字典序代替语义版本比较来判断 1.9 与 1.10。

{ pin }: {
  patchelf = pin.mk {
    checker = pin.checker.git {
      target = "https://github.com/NixOS/patchelf.git";
      mode = "tag";
      include = "^[0-9]+[.][0-9]+[.][0-9]+$";
      sort = "semver";
    };
    fetcher = pin.fetcher.git { target = "https://github.com/NixOS/patchelf.git"; };
  };
}

branch 只用于 branch 模式,ref 只用于 ref 模式。没有匹配 tag 或无法解析 ref 会使该 Pin 失败。

crates.io:pin.checker.crate

目标为 target 或 name,表示 crate 名。读取 crates.io 返回的 newest_version,没有该字段时使用 max_version;不是只选择稳定版本的过滤器。

{ pin }: {
  ripgrep = pin.mk {
    checker = pin.checker.crate { target = "ripgrep"; };
    fetcher = pin.fetcher.url {
      url = version: "https://crates.io/api/v1/crates/ripgrep/${version}/download";
    };
  };
}

PyPI:pin.checker.pypi

目标为 target 或 name,表示 PyPI 项目名。读取项目 JSON 中的 info.version。下载文件可通过版本映射独立选择:

{ pin }: {
  requests = pin.mk {
    checker = pin.checker.pypi { target = "requests"; };
    fetcher = pin.fetcher.zip {
      url = version: "https://files.pythonhosted.org/packages/source/r/requests/requests-${version}.tar.gz";
    };
  };
}

npm:pin.checker.npm

目标为 target 或 name,支持 scoped package 名。distTag 默认 latest,读取 registry 的 dist-tags,可按需设置 next 等其他标签。它不会自行扫描所有版本并排序。

{ pin }: {
  vite = pin.mk {
    checker = pin.checker.npm { target = "vite"; distTag = "latest"; };
    fetcher = pin.fetcher.url {
      url = version: "https://registry.npmjs.org/vite/-/vite-${version}.tgz";
    };
  };
}

URL:pin.checker.url

目标为 target 或 url,必需 regex。请求 URL 后匹配文本:有捕获组时使用第一组,否则使用完整匹配。匹配结果必须非空。

{ pin }: {
  patchelf = pin.mk {
    checker = pin.checker.url {
      target = "https://api.github.com/repos/NixOS/patchelf/releases/latest";
      regex = ''"tag_name"[[:space:]]*:[[:space:]]*"([^"]+)"'';
    };
    fetcher = pin.fetcher.github { target = "NixOS/patchelf"; };
  };
}

命令:pin.checker.cmd

接收命令字符串。stdout 去除首尾空白后作为 Version,必须非空;命令必须成功退出。适合固定版本或内置 Checker 尚未覆盖的上游。

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

命令配置属于受信任的可执行输入,不是沙箱。stdout 只输出版本,把诊断日志写到 stderr。