2017-08-28 1 views
3

donné après default.nix,Comment obtenir le champ "nom" hors de l'expression nix?

{ stdenv, fetchurl, perl }: 

stdenv.mkDerivation { 
    name = "hello-2.1.1"; 
    builder = ./builder.sh; 
    src = fetchurl { 
    url = ftp://ftp.nluug.nl/pub/gnu/hello/hello-2.1.1.tar.gz; 
    md5 = "70c9ccf9fac07f762c24f2df2290784d"; 
    }; 
    inherit perl; 
} 

Comment puis-je obtenir la valeur hello-2.1.1 de champ à l'aide namenix-instantiate?

$ nix-instantiate --eval -E 'name' default.nix 
error: undefined variable ‘name’ at (string):1:1 

Répondre

2

Ce que votre invocation nix-instantiate fait, tente de récupérer name d'une portée presque vide. Ce qui manque ici est une fonctionnalité qui est implémentée dans NixPkgs fournit les arguments à votre fonction dans default.nix.

Obtenons la fonction callPackage de votre <nixpkgs> actuelle:

(import <nixpkgs> {}).callPackage 

callPackage nécessite deux arguments, une fonction qui définit le package et un ensemble d'attributs de remplacements. Au lieu de fournir directement la fonction, vous pouvez fournir une référence de fichier à la place.

(import <nixpkgs> {}).callPackage ./. {} 

Maintenant, nous allons obtenir le nom

((import <nixpkgs> {}).callPackage ./. {}).name 

et l'exécuter

$ nix-instantiate --eval -E '((import <nixpkgs> {}).callPackage ./. {}).name' 
"hello-2.1.1" 

Pour expérimenter avec Nix, je préfère utiliser nix-repl bien. Il est plus facile à utiliser et a l'achèvement de l'onglet.

$ nix-env -iA nixpkgs.nix-repl 
$ nix-repl 
nix-repl> ((import <nixpkgs> {}).callPackage ./. {}).name 
"hello-2.1.1" 
+0

Où puis-je en savoir plus sur l'expression nix? Y a-t-il de bons tutoriels? Le [manuel] (https://nixos.org/nix/manual/#ch-expression-language) n'a pas beaucoup d'exemple. – wizzup

+0

@wizzup Nix lui-même est assez générique, donc le manuel explique vraiment seulement la syntaxe et comment les dérivations fonctionnent. Si vous voulez mieux comprendre les expressions existantes dans nixpkgs, lisez le manuel de nixpkgs (https://nixos.org/nixpkgs/manual/), si vous voulez comprendre pourquoi les choses sont implémentées avec certains patterns il y a les Nix Pills (https: //nixos.org/nixos/nix-pills/index.html) –