2017-01-05 2 views
4

Ich erstelle mein eigenes Repository, um einige Quellquellen zu holen.Wie "nix-build" wieder einen gebauten Store-Pfad?

# packages.nix 
with (import <nixpkgs> {}); 

rec { 
    rustcSource = fetchgit { 
    url = https://github.com/rust-lang/rust; 
    rev = "3191fbae9da539442351f883bdabcad0d72efcb6"; 
    sha256 = "0w1l14kz9kxyj5dw3w9xxk1fzww5xqs3sf8saay0mh7nkmvrdb59"; 
    }; 
} 

Dann baue ich rustcSource,

sudo nix-env -f package.nix -A rustcSource 

Es zeigt einen Speicherpfad von /nix/store/096fpy9qjbz5r14aadjnq9d2md9ql9cg-rust-3191fba. Das Problem ist, dass ich es Submodule zum Download vergessen haben, so dass ich meinen Ausdruck Submodule enthalten ändern,

with (import <nixpkgs> {}); 

rec { 
    rustcSource = fetchgit { 
    url = https://github.com/rust-lang/rust; 
    rev = "3191fbae9da539442351f883bdabcad0d72efcb6"; 
    sha256 = "0w1l14kz9kxyj5dw3w9xxk1fzww5xqs3sf8saay0mh7nkmvrdb59"; 
    leaveDotGit = true; 
    fetchSubmodules = true; 
    }; 
} 

Aber ich entdeckte, dass nix-build nicht den Hash neu zu berechnen und sehen, dass der Weg gebaut wurde. Die Submodule werden also nicht heruntergeladen.

Q: Ist es Nix-Fehler? Wie kann ich das Repository "neu aufbauen" oder neu laden?

P.S. Eigentlich erstelle ich eine Ableitung mit fetchgit, aber es schlägt fehl, weil die Submodule nicht heruntergeladen werden. Also, der obige Fall vereinfacht mein Problem.

Antwort

3

Kein Fehler, dies ist von Entwurf.

Ableitungen, die einen Hash angeben, werden als Ableitungen mit festem Ausgang bezeichnet, und sie prüfen nur, ob Hash mit vorhandenen Ableitungen im Speicher übereinstimmt und diese verwenden. Daher wird Ihre fetchSubmodules-Änderung ignoriert.

Weitere Diskussionen siehe https://github.com/NixOS/nix/issues/969

+0

Danke für die Antwort! Irgendeine Ausarbeitung, wie man das Problem beheben kann? (so kann ich mit 'fetchSubmodules' wieder auf true setzen) – Abdillah

+1

Ändern Sie den Hash in etwas zufälliges und nix meldet Ihnen den korrekten Hash. – iElectric

2

Um das Problem zu beheben, müssen Sie den Hash auf einen Wert ändern, die nicht bereits eine gültige Hash jeden Pfades in Ihrem nichts Speicher ist.

Für feste Ausgaben Ableitungen (das sind diejenigen, die einen expliziten Hash angegeben haben und nur diejenigen erhalten Netzwerkzugriff), wenn der Hash bereits einen Pfad im Nix-Speicher entspricht, dann überspringt Nix den Download und einfach die bestehender Pfad Die Änderung des Hash-Werts (damit er nicht mehr übereinstimmt) sollte also ausreichen, um eine Neuerstellung zu erzwingen.

+0

Vielen Dank für Ihre Antwort @bennofs! Ich spezifiziere nicht, Hash nicht zu ändern. Aber eigentlich habe ich versucht, eine stabile Version von 'rustc' herunterzuladen. Hash ändern bedeutet also, Version/Stabilität zu ändern. – Abdillah

1

Das Abrufen von Submodulen führt zu einem Paket mit einem anderen Hashwert. Der einfachste Weg, dies zu beheben, besteht darin, den Hash in einen ungültigen Wert zu ändern und das Paket neu zu erstellen. Die Fehlermeldung enthält den richtigen Hash. Verwenden Sie das und erstellen Sie es neu.

Verwandte Themen