参考文档

Package Builder

Go Modules、npm、pnpm 的依赖哈希与下游消费方法。

这些构造器用于 Source 的 packages。当前公开 Builder 为 pin.goModule、pin.npmPackage 和 pin.pnpmPackage,不包含 Cargo Builder。crates.io Checker 只负责版本检查。

字段与产物

构造器必需字段Derived Hash依赖产物
pin.goModulerootvendorHashgoModules
pin.npmPackagerootnpmDepsHashnpmDeps
pin.pnpmPackageroot、正整数 fetcherVersionpnpmDepsHashpnpmDeps

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 路径。