2017-11-25 20 views
1

방금 ​​OSX에서 Nix 패키지 관리자를 사용하기 시작했으며 Nixpkgs 저장소에서 사용할 수없는 pass 바이너리 (https://www.passwordstore.org)에 대한 첫 번째 패키지를 만들려고합니다.Nix 패키지 런타임 종속성 지정

런타임 종속성 (getopt)을 지정하려고 시도했지만 이진 파일을 사용할 때 사용할 수없는 것으로 보입니다.

{ 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) :

이 내 패키지의 default.nix입니다. 내 패키지에 대한 런타임 종속성 목록

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가 아니라 /bin에 바이너리가 있다고 가정하므로 .../artifact를 생략해야합니다. (아마도 문제의 원인이 아닐 수도 있습니다.) –

+1

재미있는 사실 : URL의 인용 부호를 취소 할 수 있습니다. –

답변

0

getopt은 특별한 대우를 얻습니다. darwin.sh 스크립트는 brewport을 사용하여이 스크립트를 찾고 /usr/local으로 폴백합니다. 이것이 (올바른) 래퍼가 아무런 효과가없는 이유입니다.

따라서 해결책은 래퍼 스크립트에서 제공하는 을 PATH으로 바꾸는 것입니다. 소스 코드를 패치에 대한

(openbsd.sh과 유사) GETOPT=getopt, 그것은 암호 매장처럼 보인다 NixPkgs documentation

+0

Robert 님, 제안한대로'src/platform/darwin.sh'에'GETOPT = getopt' 치환을 적용하여 완벽하게 작동합니다. 도와 주셔서 대단히 감사합니다! – b73

0

nix-build를 실행 한 후, 당신은 당신의 래퍼 스크립트를보고는 확인을 보이는 있는지 확인 cat result/bin/pass를 실행해야합니다. getopt를 포함하도록 PATH를 설정하고 result/artifact/bin/pass을 호출하는 쉘 스크립트 여야합니다.

그런 다음 래퍼 스크립트를 실행 해보십시오. 래퍼는 result/artifact/bin이 아니라 result/bin이어야합니다.

+0

David 님, wrapper가'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 [@]} ""$ @ "'. wrapper 스크립트를 실행할 때 (설치 한'pass' 바이너리를 실행할 때와 같은) 동일한 오류가 발생합니다 : '/ usr/local/bin/getopt : 해당 파일이나 디렉토리가 없습니다' – b73

+1

OK, 다른 것 이 프로그램을 패치하는 것만으로도'getopt'가 PATH에 있는지를 호출하거나,'getopt'를 Nax 저장소에서 전체 경로와 함께 호출합니다. '/ usr'을 보아서는 안되며, 그 이유는 그것이 Nix의 순결이라는 목표에 어긋나기 때문입니다. –

+0

데이비드에게 로버트에게 보내는 제 의견에 설명 된대로 패스를 패치했습니다. 모든 일. 도와 주셔서 감사합니다! – b73