2017-11-25 40 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