第一个 Pin
本教程用 NixOS/patchelf 演示一条完整路径。GitHub 是入门示例,nix-pins 还支持其他版本检查方式和获取方式。
创建声明
完成安装后,在克隆的 nix-pins 仓库根目录创建工作目录:
mkdir -p demo
cd demo
创建 pins-config.nix:
{ pin }: {
patchelf = pin.github "NixOS/patchelf";
}
patchelf 是本地 Pin 名。pin.github 读取该仓库的最新 GitHub release,将原始 tag 作为 Version,使用同一 tag 获取源码。简写创建名为 default 的 Source。
更新与查看
nix-pins update
nix-pins status
默认从当前目录读取 pins-config.nix,把结果写入 pins.json。update 联网检查版本并计算源码哈希;status 只读报告当前锁定结果,不检查新的上游版本。
pins.json 的主要层次为 pins.patchelf.version 和 pins.patchelf.sources.default。Source 中包含 Fetcher 参数、源码 hash,以及可选的 derived 哈希。将配置与 Pins File 一起纳入项目版本控制,以便下游使用同一份锁定结果。
在 Nix 中使用结果
在 demo/ 中创建 source.nix。../nix/pins.nix 指向克隆的工具仓库中的 Reader:
let
pkgs = import <nixpkgs> {};
pins = import ../nix/pins.nix {
inherit pkgs;
file = ./pins.json;
};
in
pins.patchelf.sources.default.src
构建锁定的源码:
nix build --impure --file source.nix --no-link
下游 derivation 可以把这个 src 作为输入,例如在 pkgs.stdenv.mkDerivation 中使用:
{
pname = "patchelf";
version = pins.patchelf.version;
src = pins.patchelf.sources.default.src;
}
这个片段只展示输入属性,应用的完整构建步骤由下游定义。后续添加 Package 或补丁时,Reader 还需要 config 参数,见 Reader 参考。
下次更新
nix-pins update patchelf
确认 pins.json 的变更,再重新构建下游包。其他上游不必使用 GitHub:可以通过 pin.mk 独立组合 Checker 和 Fetcher,见组合来源。