【问题标题】:Nix external software built/installed is not being found未找到构建/安装的 Nix 外部软件
【发布时间】:2018-05-09 05:39:45
【问题描述】:

我刚刚开始在 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

谁能告诉我我做错了什么?

谢谢

【问题讨论】:

  • 密码存储似乎对某些路径进行了硬编码。您可能需要修补这些。
  • 您可能应该省略 .../artifact,因为生态系统的其他部分会假定二进制文件位于 /bin,而不是 /artifact/bin。 (可能不是您的问题的原因)
  • 有趣的事实:您可以取消引用 URL。
  • 谢谢罗伯特,我已经修改了我的包,以便包装器位于result/bin - 但结果是相同的。当我查看pass 源时,我看不到getopt 的任何明显硬编码路径。当您建议修补路径时,您指的是在 config.nix 文件中使用 packageOverrides 吗?

标签: nix nixos


【解决方案1】:

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

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

【讨论】:

  • 谢谢大卫,我修改了我的包,使包装器位于result/binresult/bin/pass 设置路径:export PATH="/nix/store/..-getopt-1.1.4/bin",然后调用:exec -a "$0" "/nix/store/...-pass-1.7.1/bin/.pass-wrapped" "${extraFlagsArray[@]}" "$@"。当我运行包装脚本时,我得到了同样的错误(当我运行安装的pass 二进制文件时):/usr/local/bin/getopt: No such file or directory
  • 好的,您需要做的另一件事是修补该程序,以便它只调用 PATH 上的任何 getopt,或者从 Nix 商店调用正确的 getopt 及其完整路径。它不应该在 /usr 中查找,因为这违背了 Nix 的纯洁性目标。
  • 谢谢大卫,我修补了pass,正如我对罗伯特的评论中所述。都在工作。感谢您的帮助!
【解决方案2】:

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

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

要修补源代码,请参阅NixPkgs documentation

【讨论】:

  • 谢谢罗伯特,我按照你的建议修补了src/platform/darwin.sh,应用了GETOPT=getopt 替换,并且效果很好。非常感谢您的帮助!
猜你喜欢
  • 2017-10-08
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2021-05-04
相关资源
最近更新 更多