快速开始

第一个 Pin

从一个 GitHub 示例开始,完成版本检查、源码锁定与 Nix 消费。

本教程用 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,见组合来源。