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。