指定Nix包运行时依赖项

时间:2017-11-25 13:03:31

标签: nix nixos

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

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

这是我的包的default.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

任何人都可以告诉我做错了吗?

由于

2 个答案:

答案 0 :(得分:1)

看起来getopt得到了特殊待遇。 darwin.sh脚本使用brewport查找并回退到/usr/local。这就是(正确的)包装器没有效果的原因。

所以解决方案似乎是,让它在getopt中寻找PATH,它由包装器脚本提供。您可以将其设为GETOPT=getopt(类似于openbsd.sh

这么简单

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

答案 1 :(得分:0)

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

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