如何在 Nix 中打包命令行工具?

How to package a command-line tool in Nix?

假设您有一个简单的 bash 脚本集合组成一个命令行工具,bin/ 中有一个主脚本,lib/ 中有一些库脚本,所有这些都需要打包为了方便起见,Nix 使用 tool.nixdefault.nix

scriptdir
 └─ bin/
     └─ tool
 └─ lib/
 └─ default.nix
 └─ tool.nix

tool.nix 应该是什么样子才能正确打包此工具,从而允许在 shell 和 tool <args> 中执行 tool

在 IRC 的一些帮助下,以下 tool.nix 有效:

{ stdenv }:

let

    version = "0.0.1";

in stdenv.mkDerivation 
rec 
{

    name = "tool-${version}";

    src = ./.;

    installPhase =
        ''
            mkdir -p $out
            cp -R ./bin $out/bin
            cp -R ./lib $out/lib
        '';

}

为了完整起见,default.nix 看起来像

{ pkgs ? import <nixpkgs> {} }:

pkgs.callPackage ./tool.nix {}

并且可以通过从 scriptdir 调用 nix-env -f ./default.nix -i 来安装。