2017-11-25 5 views
1

Ich habe gerade den Nix-Paket-Manager unter OSX gestartet und versuche mein erstes Paket für die pass-Binärdatei (https://www.passwordstore.org) zu erstellen, die im Nixpkgs-Repository nicht verfügbar ist.Nix-Paket-Laufzeitabhängigkeiten angeben

Ich versuche, eine Laufzeitabhängigkeit anzugeben (getopt), jedoch scheint dies nicht verfügbar zu sein, wenn die Binärdatei verwendet wird.

Dies ist meine Pakete des 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; 
       }; 
     }; 
} 

Ich kann dieses Paket erfolgreich bauen (nix-build --show-trace) und installieren Sie es (nix-env -i ./result).

die Laufzeitabhängigkeiten für mein Paket Listing getopt aufgeführt:

nix-store -qR $(which pass) 

... 
/nix/store/c5swmygzc0kmvpq6cfkvwm2yz1k57kqy-getopt-1.1.4 

jedoch, wenn ich komme die binäre zu verwenden (pass init my-key) bekomme ich die folgende Fehlermeldung:

/nix/store/...-pass-1.7.1/artifact/bin/pass: line 302: 
/usr/local/bin/getopt: No such file or directory 

Kann jemand raten, was Ich mache falsch?

Dank

+0

Es ist wie Passwort-Speicher scheint Hardcodes einige Wege. Möglicherweise müssen Sie diese patchen. –

+0

Sie sollten wahrscheinlich das .../Artefakt weglassen, da andere Teile des Ökosystems davon ausgehen, dass Binärdateien in /bin, nicht /artefact/bin sind. (Wahrscheinlich nicht die Ursache für Ihr Problem) –

+1

Fun Tatsache: Sie können URLs unquote. –

Antwort

0

Es sieht aus wie getopt bekommt eine spezielle Behandlung. Das Skript darwin.sh sucht mit brew und port danach und fällt auf /usr/local zurück. Deshalb hat der (korrekte) Wrapper keine Wirkung.

So scheint die Lösung zu sein, getopt in PATH, die von der Wrapper-Skript zur Verfügung gestellt wird. Sie können sich wahrscheinlich es so einfach machen wie GETOPT=getopt (die openbsd.sh ähnlich ist)

Für Quellcode Patchen finden Sie in der NixPkgs documentation

+0

Danke Robert, ich habe 'src/platform/darwin.sh' gepatcht und die 'GETOPT = getopt'-Ersetzung angewendet, wie du es vorgeschlagen hast, und es funktioniert perfekt. Vielen Dank für Ihre Hilfe! – b73

0

Nach nix-build läuft, sollten Sie cat result/bin/pass laufen in Ihrer Wrapper-Skript suchen und sicherstellen, dass es in Ordnung aussieht. Es sollte ein Shell-Skript sein, das PATH auf getopt einstellt und dann result/artifact/bin/pass aufruft.

Versuchen Sie dann, das Wrapper-Skript auszuführen. Beachten Sie, dass die Umhüllung in result/bin, nicht result/artifact/bin sein sollte.

+0

Danke David, ich habe mein Paket so modifiziert, dass der Wrapper in 'result/bin' ist. 'result/bin/pass' setzt den PATH:' export PATH = "/ nix/store /..- getopt-1.1.4/bin" 'und ruft dann:' exec -a "$ 0" "/ nix/store/...- pass-1.7.1/bin/.pass-wrapped "" $ {extraFlagsArray [@]} "" $ @ "'. Wenn ich das Wrapper-Skript ausführen, bekomme ich den gleichen Fehler (wie wenn ich die installierte binary binary ausführen): '/ usr/local/bin/getopt: Keine solche Datei oder Verzeichnis' – b73

+1

OK, die andere Sache Sie müssen das Programm patchen, so dass es nur aufruft, was auch immer "getopt" auf dem PATH ist, oder das korrekte "getopt" aus dem Nix-Store mit seinem vollständigen Pfad aufruft. Es sollte nicht in '/ usr' nachsehen, denn das geht gegen das Ziel der Reinheit in Nix. –

+0

Danke David, ich habe 'pass' gepatcht, wie in meinem Kommentar zu Robert beschrieben. Alles funktioniert. Danke für die Hilfe! – b73