未找到 Nix 外部软件 built/installed
Nix external software built/installed is not being found
我刚刚开始在 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
谁能告诉我做错了什么?
谢谢
在 运行 宁 nix-build
之后,您应该 运行 cat result/bin/pass
查看您的包装脚本并确保它看起来正常。它应该是一个 shell 脚本,它将 PATH 设置为包含 getopt 然后调用 result/artifact/bin/pass
.
然后尝试 运行 包装器脚本。请注意,包装器应位于 result/bin
,而不是 result/artifact/bin
。
看来 getopt
得到了特殊待遇。 darwin.sh 脚本使用 brew
和 port
查找它并回退到 /usr/local
。这就是(正确的)包装器无效的原因。
所以解决方案似乎是,让它在 PATH
中查找 getopt
,这是由包装脚本提供的。您可以将其简化为 GETOPT=getopt
(类似于 openbsd.sh
)
有关补丁源代码,请参阅 NixPkgs documentation
我刚刚开始在 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
谁能告诉我做错了什么?
谢谢
在 运行 宁 nix-build
之后,您应该 运行 cat result/bin/pass
查看您的包装脚本并确保它看起来正常。它应该是一个 shell 脚本,它将 PATH 设置为包含 getopt 然后调用 result/artifact/bin/pass
.
然后尝试 运行 包装器脚本。请注意,包装器应位于 result/bin
,而不是 result/artifact/bin
。
看来 getopt
得到了特殊待遇。 darwin.sh 脚本使用 brew
和 port
查找它并回退到 /usr/local
。这就是(正确的)包装器无效的原因。
所以解决方案似乎是,让它在 PATH
中查找 getopt
,这是由包装脚本提供的。您可以将其简化为 GETOPT=getopt
(类似于 openbsd.sh
)
有关补丁源代码,请参阅 NixPkgs documentation