2017-01-05 2 views
4

Je crée mon propre dépôt pour récupérer une source git.Comment `nix-build` à nouveau un chemin de magasin construit?

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

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

Puis-je construire rustcSource,

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

Il révèle un chemin de magasin de /nix/store/096fpy9qjbz5r14aadjnq9d2md9ql9cg-rust-3191fba. Le problème est, j'ai oublié de le télécharger est sous-modules, donc je changer mon expression pour inclure des sous-modules,

with (import <nixpkgs> {}); 

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

Mais, j'ai découvert que nix-build ne recalcule pas le hachage et voir que le chemin a été construit. Donc, il finit par ne pas télécharger les sous-modules.

Q: Est-ce bug nix? Comment puis-je "reconstruire" ou redéposer le référentiel?

P.S. En fait, je crée une dérivation avec fetchgit, mais elle échoue parce que les sous-modules ne sont pas téléchargés. Donc, le cas ci-dessus simplifie mon problème.

Répondre

3

Pas un bug, c'est par conception.

Les dérivations qui spécifient un hachage sont appelées des dérivations à sortie fixe et elles vérifient seulement si hash correspond à des dérivations existantes en stock et l'utilisent. Donc, votre changement de fetchSubmodules est ignoré.

Pour une discussion plus approfondie voir https://github.com/NixOS/nix/issues/969

+0

Merci pour la réponse! Une explication sur la façon de résoudre le problème? (donc je peux reconstruire en utilisant 'fetchSubmodules' réglé sur true) – Abdillah

+1

Changez le hash en quelque chose de aléatoire et nix vous rapportera le hachage correct. – iElectric

2

Pour résoudre ce problème, vous devez changer le hachage à une valeur qui n'est pas déjà un hachage valide de tout chemin dans votre magasin nix. Pour les dérivations à sortie fixe (celles qui ont un hachage explicite spécifié et uniquement celles qui obtiennent un accès au réseau), si le hachage correspond déjà à un chemin dans le magasin nix, alors nix sautera le téléchargement et utilisera simplement le chemin existant. Donc changer légèrement le hachage (de sorte qu'il ne correspond plus) devrait suffire à forcer une reconstruction.

+0

Merci pour votre réponse @bennofs! Je ne précise pas de ne pas changer le hachage. Mais en fait, j'ai essayé de télécharger une version stable de 'rustc'. Donc, changer de hash signifie changer de version/stabilité. – Abdillah

1

L'extraction de sous-modules donnera un paquet avec un hachage différent. La solution la plus simple consiste à remplacer le hachage par une valeur non valide et à reconstruire le package. Le message d'erreur inclura le hachage correct. Utilisez cela et reconstruisez.