Package 与依赖哈希
Package 属于 Source,声明在 packages 中。它共享 Pin 的 Version 和 Source 的源码,但拥有自己的 Builder 和依赖产物。nix-pins 计算的是中间依赖 FOD 的哈希,应用的完整构建仍由下游负责。
一个 Go Package
{ pin }: {
gofzf = pin.github {
target = "junegunn/fzf";
packages.default = pin.goModule { root = "."; };
};
}
Reader 传入 config 后,Package 位于 pins.gofzf.sources.default.packages.default。读取 vendorHash 或 goModules,并在下游 buildGoModule 中复用对应源码和版本。
npm 与 pnpm
pin.npmPackage 使用 buildNpmPackage 的 npmDeps,计算 npmDepsHash。上游需要提供可用的 package-lock.json。
pin.pnpmPackage 使用 fetchPnpmDeps,计算 pnpmDepsHash。需要显式给出 root 和正整数 fetcherVersion;使用相同的 pnpm 版本和 Node.js 版本配置下游依赖安装。
{ pin, pkgs }: {
app = pin.github {
target = "QuantumNous/new-api";
packages.web = pin.pnpmPackage {
root = "web";
fetcherVersion = 3;
pnpm = pkgs.pnpm;
};
};
}
这个配置展示子目录声明方式;所选上游版本的该目录必须确实包含兼容的 pnpm-lock.yaml。工具不创建或修复上游锁文件。更多限制和下游使用方式见 Package Builder。
多个 Package
在一个 Source 的 packages 下声明不同名字即可。若同一 Source 中只有一个同类型的 Package,Derived Hash 使用 vendorHash、npmDepsHash 或 pnpmDepsHash;多个同类型 Package 会带 Package 名前缀,例如 cli.vendorHash。
下游优先通过 Reader 的具名 packages 访问产物,避免自己推断 derived 键。工具按中间依赖 derivation 的输入指纹判断是否需要重算哈希;是否复用由真实构建输入决定。