参考文档

Pin 声明

pin.mk、pin.github、pin.git 与 Pin/Source/Package 的关系。

声明文件是 Nix 函数,返回以 Pin 名为键的属性集。可请求 pin、pkgs 和 lib 参数;仅声明需要的参数即可:

{ pin }: {
  patchelf = pin.github "NixOS/patchelf";
}

数据层次

  • Pin:一个 Checker、一个 Version 和若干 Source;是选择与更新的原子单元。
  • Source:一个 Fetcher、一个源码 Hash,以及该来源的补丁和 Package。
  • Package:一个 Builder 和对应的依赖产物、Derived Hash。

pin.mk

用于独立组合 Checker、Fetcher 和 Package。单 Source 可直接提供顶层 fetcher,它会被命名为 default:

{ pin }: {
  demo = pin.mk {
    checker = pin.checker.cmd "printf '0.18.0'";
    fetcher = pin.fetcher.github {
      target = "NixOS/patchelf";
    };
  };
}
字段含义
checker必需,来自 pin.checker.*
sources可选,非空的具名 Source 属性集
fetcher未提供 sources 时必需,属于单 Source 简写
patches单 Source 的补丁列表,默认 []
postPatch单 Source 的补丁脚本,默认空字符串
packages单 Source 的具名 Package 属性集,默认 {}

多 Source 时,fetcher、patches、postPatch 和 packages 放入各 Source,见多 Source。

pin.github

接受 "owner/repo" 字符串或结构化参数,组合 GitHub release Checker 与 GitHub Fetcher,只生成 default Source。

{ pin }: {
  patchelf = pin.github {
    target = "NixOS/patchelf";
    rev = version: version;
  };
}

目标可使用 target,也可用 owner 与 repo;两种方式不能混用。其他字段为 rev、fetcherArgs、patches、postPatch 和 packages。

pin.git

接受仓库 URL 字符串或结构化参数,组合 Git Checker 与 Git Fetcher,只生成 default Source。默认追踪 Git HEAD:

{ pin }: {
  patchelf = pin.git "https://github.com/NixOS/patchelf.git";
}

结构化参数必须使用 target。还可配置 Checker 的 mode、branch、ref、include、exclude、sort,以及 Fetcher 的 rev、fetcherArgs 和 Source 的 patches、postPatch、packages。

复杂组合使用 pin.mk。声明的未知字段、Fetcher 映射错误和确定性的配置错误会在运行 Checker 前报告。