2017-11-25 101 views
1

我刚开始在OSX上使用Nix包管理器,并且正在尝试为pass二进制文件(https://www.passwordstore.org)创建我的第一个包 - 这在Nixpkgs存储库中不可用。指定Nix包运行时依赖关系

我试图指定一个运行时依赖项(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 

谁能指教一下我做错了?

感谢

+0

好像密码店内一些硬编码路径。你可能需要修补这些。 –

+0

您可能应该省略.../artifact,因为生态系统的其他部分会假设二进制文件位于/bin中,而不是/artifact/bin。 (可能不是你的问题的原因,虽然) –

+1

有趣的事实:你可以取消引用网址。 –

回答

0

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

因此,解决方案似乎是,使其寻找在PATH,它由包装脚本提供。你或许可以把它作为简单GETOPT=getopt(这是类似openbsd.sh

打补丁的源代码,请参见NixPkgs documentation

+0

感谢罗伯特,我打补丁'的src /平台/ darwin.sh'应用'getopt的= getopt'替代如你所说,它完美的作品。非常感谢您的帮助! – b73

0

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

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

+0

谢谢大卫,我修改了我的包,使包装器在'result/bin'中。 'result/bin/pass'设置PATH:'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:没有这样的文件或目录' – b73

+1

好的,另一件事你需要做的就是修补这个程序,所以它只是调用PATH中的任何'getopt',或者用它的完整路径从Nix存储区调用正确的'getopt'。它不应该在'/ usr'中查找,因为这违背了Nix纯度的目标。 –

+0

谢谢大卫,我按照我对罗伯特的评论中所描述的那样打了'通'。所有的工作。感谢帮助! – b73