找不到 Nix 构建/安装的外部软件



我刚刚开始使用OSX上的Nix包管理器,我正在尝试为pass二进制(https://www.passwordstore.org)创建我的第一个包 - 这在Nixpkgs存储库中不可用。

我正在尝试指定运行时依赖项(getopt),但是当使用二进制文件时,这似乎不可用。

这是我的软件包的默认.nix:

{ pkgs ? import <nixpkgs> {} }:
with pkgs;
let
version = "1.7.1";
in {
pass = stdenv.mkDerivation rec {
name = "pass-${version}";
src = fetchurl {
url = "https://git.zx2c4.com/password-store/snapshot/password-store-1.7.1.tar.xz";
sha256 = "0scqkpll2q8jhzcgcsh9kqz0gwdpvynivqjmmbzax2irjfaiklpn";
};
buildInputs = [ stdenv makeWrapper];
installPhase = ''
make install PREFIX=$out/artifact
makeWrapper $out/artifact/bin/pass $out/bin/pass 
--set PATH ${stdenv.lib.makeBinPath [ getopt ]}
'';
meta = {
homepage = "https://www.passwordstore.org";
description = "The standard unix password manager";
license = stdenv.lib.licenses.gpl2Plus;
};
};
}

我可以成功构建这个包(nix-build --show-trace)并安装它(nix-env -i ./result)。

列出我的包的运行时依赖项将显示getopt列出:

nix-store -qR $(which pass)
...
/nix/store/c5swmygzc0kmvpq6cfkvwm2yz1k57kqy-getopt-1.1.4

但是,当我开始使用二进制文件(pass init my-key)时,出现以下错误:

/nix/store/...-pass-1.7.1/artifact/bin/pass: line 302:
/usr/local/bin/getopt: No such file or directory

谁能告诉我做错了什么?

谢谢

看起来getopt得到了特殊待遇。darwin.sh 脚本使用brewport查找它,并回退到/usr/local。这就是为什么(正确的)包装器不起作用的原因。

所以解决方案似乎是,让它在包装脚本提供的PATH中查找getopt。您可能可以使其像GETOPT=getopt一样简单(类似于openbsd.sh)

有关修补源代码的信息,请参阅 NixPkgs 文档

运行nix-build后,您应该运行cat result/bin/pass以查看包装脚本并确保它看起来正常。 它应该是一个 shell 脚本,它将 PATH 设置为包含 getopt,然后调用result/artifact/bin/pass

然后尝试运行包装脚本。 请注意,包装器应该在result/bin中,而不是result/artifact/bin中。

最新更新