该技能用于把 npm/TypeScript/Bun 编写的命令行工具打包成 Nix derivation,适合需要将 JavaScript/TypeScript CLI 工具纳入 Nix 生态、追求可复现构建的用户。
用途
面向创建 JavaScript/TypeScript 工具的 Nix 包,来源可以是 npm registry,也可以是 GitHub 源码。技能区分两条路径:已构建并发布到 npm 的工具采用预构建方式(更快、更简单);仅提供源码或 package.json 含构建脚本的工具采用源码构建方式。
主要能力
- 预构建路径:通过 fetchzip 拉取 npm tarball,在 installPhase 中复制 dist/cli.js 到 $out/bin,设置可执行权限,并用 substituteInPlace 将 shebang 替换为 Nix 商店中的 node 路径。
- 源码构建路径:通过 fetchFromGitHub 获取源码,使用 fetchBunDeps 固定依赖,构建时复制并修补 node_modules、执行 patchShebangs、autoPatchelf,最后用 bun run build 构建并以 makeBinaryWrapper 封装。
- 识别包类型:检查 npm 包是否含 dist/ 目录、package.json 的 bin、type、scripts 字段以及运行时要求,据此选择路径。
- 获取哈希:使用 nix-prefetch-url 获取源码哈希,并用 nix hash convert 转为 SRI 格式;依赖哈希可先填 lib.fakeHash,通过构建报错迭代获得。
- 创建包结构:建议两文件模式,package.nix 放置完整 derivation,default.nix 通过 pkgs.callPackage 调用,便于独立使用或集成进 flake。
- 处理特殊情况:复制 WASM 等资源、安装多个可执行文件、针对平台限定(如 Bun 编译产物常为 Linux 专用)。
- 测试构建:nix build、运行 --version/--help、ldd 检查依赖、nix fmt、nix flake check。
使用方式
按步骤执行:先识别包类型,再获取哈希,随后创建包文件,处理特殊情况,最后测试构建。常见模式包括 shebang 替换(replace-quiet 抑制未匹配警告)、本地依赖处理(autoPatchelfHook、stdenv.cc.cc.lib、autoPatchelfIgnoreMissingDeps)、Bun 编译产物需设置 dontStrip = true、检查 tarball 内容布局。
元数据与规范
每个包需完整 meta:description、homepage、license、sourceProvenance(fromSource / binaryBytecode / binaryNativeCode)、maintainers、mainProgram、platforms。反模式包括硬编码 /usr/bin/node、跳过哈希校验、忘记 chmod +x、剥离 Bun 二进制。
适用场景与限制
适用于把 npm/GitHub 上的 JS/TS CLI 工具封装进 Nix,强调可复现构建、依赖解析与 shebang 正确性。常见问题涵盖哈希不匹配、可执行文件缺失、ELF 解释器错误、bun.lock 不匹配。若仅在 Linux 测试,应保守标注平台或注明其他平台未测试。具体版本、价格、维护状态等资料未提供。