Package Builder
这些构造器用于 Source 的 packages。当前公开 Builder 为 pin.goModule、pin.npmPackage 和 pin.pnpmPackage,不包含 Cargo Builder。crates.io Checker 只负责版本检查。
字段与产物
| 构造器 | 必需字段 | Derived Hash | 依赖产物 |
|---|---|---|---|
pin.goModule | root | vendorHash | goModules |
pin.npmPackage | root | npmDepsHash | npmDeps |
pin.pnpmPackage | root、正整数 fetcherVersion | pnpmDepsHash | pnpmDeps |
root 是相对于 Source 根目录的依赖目录;即使是根目录,也显式设置 root = "."。其他参数传入对应的 Nixpkgs Builder。工具注入锁定的 src、version 和依赖哈希。
Go Modules
{ pin }: {
fzf = pin.github {
target = "junegunn/fzf";
packages.default = pin.goModule { root = "."; };
};
}
底层使用 pkgs.buildGoModule,将 root 映射到 modRoot。计算哈希的对象为 goModules,不是最终应用。
npm
{ pin }: {
cpa = pin.github {
target = "seakee/CPA-Manager-Plus";
packages.web = pin.npmPackage { root = "."; };
};
}
底层使用 pkgs.buildNpmPackage,将 root 映射到 npmRoot,预取 npmDeps。上游需要匹配的 package.json 和 package-lock.json。工具不负责替上游生成锁文件。
pnpm
{ pin, pkgs }: {
app = pin.github {
target = "QuantumNous/new-api";
packages.web = pin.pnpmPackage {
root = "web";
fetcherVersion = 3;
pnpm = pkgs.pnpm;
};
};
}
底层使用 pkgs.fetchPnpmDeps。fetcherVersion 是 Nixpkgs 依赖 Fetcher 的实现版本,不是 pnpm 主版本;使用所选 Nixpkgs 支持的值。默认 pnpm 为传入的 pkgs.pnpm,需要指定其他主版本时显式覆盖。
这个示例说明子目录字段的写法,实际锁定的上游版本须提供兼容的 pnpm-lock.yaml。root 必须是非空字符串。当前锁定整个声明的 workspace,不接受非空 pnpmWorkspaces,也不接受 pnpmInstallFlags 中的 --filter、--filter-prod 或 -F 过滤。
下游消费
Reader 同时传入 Pins File 和配置后,可访问具名 Package。pnpm 的下游片段为:
let
pkgs = import <nixpkgs> {};
pins = import ../nix/pins.nix {
inherit pkgs;
file = ./pins.json;
config = ./pins-config.nix;
};
source = pins.app.sources.default;
in
pkgs.stdenv.mkDerivation {
pname = "app-web";
version = pins.app.version;
src = source.src;
pnpmDeps = source.packages.web.pnpmDeps;
pnpmRoot = "web";
nativeBuildInputs = [ pkgs.nodejs pkgs.pnpm pkgs.pnpmConfigHook ];
buildPhase = "pnpm run build";
installPhase = ''
mkdir -p $out
cp -r web/dist/. $out/
'';
}
应用的脚本、输出目录和安装步骤需按实际项目调整。依赖预取和下游安装应使用相同 pnpm 包、Node.js 和根目录。上面的 Reader 相对路径沿用快速开始目录;其他项目应改成自己固定的 Reader 路径。