如何在 Nix 中打包命令行工具?
How to package a command-line tool in Nix?
假设您有一个简单的 bash
脚本集合组成一个命令行工具,bin/
中有一个主脚本,lib/
中有一些库脚本,所有这些都需要打包为了方便起见,Nix 使用 tool.nix
和 default.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
来安装。
假设您有一个简单的 bash
脚本集合组成一个命令行工具,bin/
中有一个主脚本,lib/
中有一些库脚本,所有这些都需要打包为了方便起见,Nix 使用 tool.nix
和 default.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
来安装。