ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

nixpkgs 中的 just 构建钩子:用 just 接管 build、check 与 install 三个阶段

nixpkgs 中的 just 构建钩子:用 just 接管 build、check 与 install 三个阶段 nixpkgs 中的 just 构建钩子用 just 接管 build、check 与 install 三个阶段【免费下载链接】nixpkgsNix Packages collection NixOS项目地址: https://gitcode.com/GitHub_Trending/ni/nixpkgs本文基于 nixpkgs 文档 just 钩子说明系统讲解 nixpkgs 为 just 命令运行器提供的 setup hook 工作机制它如何默认接管buildPhase、checkPhase和installPhase如何通过justFlags、checkTarget等变量定制行为以及何时用dontUseJust*开关关闭其中某个阶段。结合钩子源码 setup-hook.sh 与仓库中的真实包示例读完本篇你将掌握在 Nix 派生中让 just 文件justfile直接驱动构建流程的完整方案。钩子的安装方式与默认行为该 setup hook 的用途是让 justjust 命令运行器承担包的构建、测试和安装。按文档定义钩子默认覆盖buildPhase、checkPhase和installPhase三个阶段。从源码结构看这个钩子并不是独立存放的文件而是直接由just包自身携带并分发的。在 just 包定义 中可以看到关键一行setupHook ./setup-hook.sh;这意味着只要把just加入某个派生derivation的nativeBuildInputsnixpkgs 的构建框架就会自动把该setupHook脚本注入构建环境——不需要在目标包中显式声明钩子。这是 nixpkgs 中“构建工具自带钩子”的典型模式与cmake、meson等工具包的setupHook属性用法一致。钩子被注入后并不无条件接管阶段。setup-hook.sh 末尾的条件覆盖逻辑 表明每个阶段只在同时满足两个条件时才会被替换if [ -z ${dontUseJustBuild-} ] [ -z ${buildPhase-} ]; then buildPhasejustBuildPhase fi即对应的dontUseJust*开关未设置且派生中没有手动定义同名阶段buildPhase等。可以推断如果你已在包定义里写了自定义buildPhase字符串钩子会主动退让不产生冲突——这为混合使用 just 与其他构建系统留出了空间。三个阶段各自的默认行为buildPhase运行 just 的默认配方文档说明buildPhase会尝试调用 just 的默认配方default recipe。对应实现位于 justBuildPhase 函数justBuildPhase() { runHook preBuild local flagsArray() concatTo flagsArray justFlags justFlagsArray echoCmd build flags ${flagsArray[]} just ${flagsArray[]} runHook postBuild }注意两个细节函数前后各调用一次runHookpreBuild/postBuild因此包定义中设置preBuild、postBuild等标准生命周期钩子依然有效just 不会绕过 stdenv 的常规机制。just ${flagsArray[]}不带任何配方名——即运行 justfile 的默认配方。这里隐含一个使用前提justfile 必须定义了默认配方例如用# default注释标记或定义单参数名为default的配方。若 justfile 没有默认配方just只会打印配方列表而不执行构建属于静默失败编写包时需要自行确认。该行为可通过设置dontUseJustBuild true关闭。checkPhase按需运行just test文档说明checkPhase会尝试调用just test配方——仅当该配方存在时。这一“探测”行为可以从 justCheckPhase 函数 的源码得到印证justCheckPhase() { runHook preCheck if [ -z ${checkTarget:-} ]; then if just -n test /dev/null 21; then checkTargettest fi fi if [ -z ${checkTarget:-} ]; then echo no test target found in just, doing nothing else local flagsArray() concatTo flagsArray justFlags justFlagsArray checkTarget echoCmd check flags ${flagsArray[]} just ${flagsArray[]} fi runHook postCheck }可以观察到三点机制探测使用just -n testdry-run 模式判断test配方是否存在不会真正执行若未探测到test配方钩子仅打印no test target found in just, doing nothing并跳过不会导致构建失败探测到的配方名会被checkTarget变量覆盖——这是文档明确指出的定制点设置checkTarget为字符串即可指定任意测试配方名例如checkTarget tests跳过了test配方的默认探测。该行为可通过设置dontUseJustCheck true关闭。installPhase运行just install配方文档说明installPhase会尝试调用just install配方。实现见 justInstallPhase 函数justInstallPhase() { runHook preInstall local flagsArray() concatTo flagsArray justFlags justFlagsArray installTargetsinstall echoCmd install flags ${flagsArray[]} just ${flagsArray[]} runHook postInstall }这里有一个文档未展开的实现细节concatTo ... installTargetsinstall表明安装配方名由installTargets变量控制默认值为install。也就是说若上游 justfile 的安装配方叫deploy或其他名字可在包定义中设置installTargets deploy无需再写自定义installPhase。该行为可通过设置dontUseJustInstall true关闭。可配置变量汇总综合 文档 与 setup-hook.sh 源码该钩子暴露以下配置变量变量类型作用justFlags字符串列表追加到每一次just调用的参数如--set key value形式的变量赋值justFlagsArray环境变量字符串与justFlags等价的另一输入通道源码中经concatTo合并进同一参数数组dontUseJustBuild布尔设为true时buildPhase不被 just 接管dontUseJustCheck布尔设为true时checkPhase不被 just 接管dontUseJustInstall布尔设为true时installPhase不被 just 接管checkTarget字符串指定 check 阶段执行的 just 配方名默认探测testinstallTargets字符串指定 install 阶段执行的 just 配方名默认install源码细节文档未列出justFlags是定制的核心手段从 justBuildPhase 的实现 可见justFlags会被合并成一个参数数组拼接到 build、check、install 三处just调用之前。实战示例仓库中的真实用法示例一cosmic-term 通过 justFlags 桥接 Nix 输出路径coshic-term 包正确路径见 cosmic-term展示了justFlags的典型用法nativeBuildInputs [ just pkg-config libcosmicAppHook ]; dontUseJustBuild true; dontUseJustCheck true; justFlags [ --set prefix (placeholder out) --set cargo-target-dir target/${stdenv.hostPlatform.rust.cargoShortTarget} ];这个例子传递了几个实践要点将just加入nativeBuildInputs即可自动获得钩子无需额外声明dontUseJustBuild/dontUseJustCheck关闭了构建与检查的接管把这两阶段交还给rustPlatform.buildRustPackage的 cargo 流程而安装阶段仍由just install配方执行justFlags中使用--set prefix (placeholder out)把 justfile 中的安装前缀指向 Nix 的输出目录占位符——由于安装目录$out在求值期未知这是 Nix 环境下让 justfile 正确安装文件的标准做法同时用--set cargo-target-dir把 cargo 目标目录显式固定到交叉编译对应的子目录避免 just 配方内部的构建产物与 Nix 的 cargo 缓存目录不一致。示例二ssh-openpgp-auth 全权交给原生流程仅借用 just 做辅助生成ssh-openpgp-auth 包 展示了另一种组合方式nativeBuildInputs [ pkg-config rustPlatform.bindgenHook just rust-script installShellFiles ]; # Otherwise justs build, check and install phases take precedence over # buildRustPackages phases. dontUseJustBuild true; dontUseJustCheck true; dontUseJustInstall true; postInstall export HOME$(mktemp -d) just generate manpages ${pname} $out/share/man/man1 just generate shell_completions ${pname} shell_completions ... ;源码注释直接点明了原因“just 的 build、check、install 阶段会优先于 buildRustPackage 的阶段”因此三个dontUseJust*开关全部置位把三个阶段的执行权完整交还 cargo。而just仅作为工具留在nativeBuildInputs中在postInstall里手动调用just generate manpages和just generate shell_completions两个辅助配方来生成 man 页与 shell 补全。这提示读者钩子的接管是阶段级的dontUseJust*关闭后 just 二进制仍在 PATH 中可以在任意自定义生命周期脚本里自由调用。使用建议与适用限制综合文档与源码使用这个钩子时需注意适用前提上游项目需要维护 justfile且至少包含默认配方供 build与install配方供 install。若上游 justfile 只有零散配方建议改用checkTarget/installTargets指定具体配方或直接用dontUseJust*关闭接管、改为在生命周期脚本中手动调用just配方。阶段可替换性由于覆盖逻辑要求对应阶段变量为空任何手动定义了buildPhase字符串的派生都会自动豁免钩子接管不会发生重复执行。与标准钩子兼容preBuild、postBuild、preCheck、postCheck、preInstall、postInstall等runHook点均被保留常规的环境变量导出、补丁操作不受影响。沙箱注意just 配方中若涉及网络访问、读取用户主目录或依赖绝对路径工具需按 Nix 构建沙箱的一般要求处理如postInstall中export HOME$(mktemp -d)的做法见 ssh-openpgp-auth 示例。探测行为的局限check 阶段仅探测名为test的配方若上游配方叫check或test-all必须显式设置checkTarget否则该阶段会静默跳过仅打印提示不报错。总体而言这个由 just 包 自带、随 setup-hook.sh 分发的钩子为 nixpkgs 提供了一条轻量路径当上游项目以 just 作为统一入口时仅需把just加入nativeBuildInputs并用justFlags、checkTarget、installTargets及三个dontUseJust*开关做少量适配即可让 justfile 直接驱动 Nix 构建的三个核心阶段。【免费下载链接】nixpkgsNix Packages collection NixOS项目地址: https://gitcode.com/GitHub_Trending/ni/nixpkgs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表