2017-11-04 2 views
1

Ich möchte Variable dotfiles_dir deklarieren, damit alle anderen Dateien es sehen und verwenden können.Wie mache ich globale Variable (oder Funktion) in Nix-Datei?

Zum Beispiel (nicht funktioniert)

In /etc/nixos/configuration.nix (es Root-Datei, nicht wahr?)

dotfiles_dir="/home/bjorn/.config/dotfiles"; 

import "${dotfiles_dir}/nixos/root/default.nix" 

und es verwenden, auch in ~/.config/nixpkgs/home.nix (mit https://github.com/rycee/home-manager)

import "${dotfiles_dir}/nixos/home/default.nix" 

Antwort

2

Ich möchte Variable dotfiles_dir deklarieren, damit alle anderen Dateien es sehen und benutzen können.

Sorry, aber das ist nicht möglich. In Nix gibt es keine globalen Variablen. Wenn dies der Fall wäre, würde es die Fähigkeit ruinieren, reproduzierbare Builds bereitzustellen, denn dann hätten Nix-Ausdrücke Zugriff auf nicht deklarierte Eingaben.

/etc/nixos/configuration.nix ist nicht Ort speichern globale Informationen, es ist technisch ein NixOS-Modul. Aber was noch wichtiger ist, es ist eine Funktion.

Allerdings ... gibt es eine Möglichkeit, einen Wert an einem Ort zu definieren und ihn überall dort zu verwenden, wo er gebraucht wird. Etwas wie folgt aus:

/etc/nixos/dotfiles-dir.nix

"/home/bjorn/.config/dotfiles" 

~/.config/nixpkgs/home.nix

let 
    dotfiles_dir = import /etc/nixos/dotfiles-dir.nix; 
    dotfiles = import (builtins.toPath "${dotfiles_dir}/nixos/home/default.nix"); 
in 
... 

könnten Sie auch bekommen mehr Phantasie ...

/etc/nixos/my-settings.nix

{ dotfiles_dir = "/home/bjorn/.config/dotfiles"; 
, some_other_value = "whatever"; 
} 

~/.config/nixpkgs/home.nix

let 
    dotfiles_dir = (import /etc/nixos/my-settings.nix).dirfiles_dir; 
    dotfiles = import (builtins.toPath "${dotfiles_dir}/nixos/home/default.nix"); 
in 
... 
+0

diese Art und Weise habe ich überall Weg zu meinen Einstellungen zu tragen. Vielleicht ist es möglich, es in den Header zu importieren (wie '{pkgs, mysettings, ...}:')? – bjornmelgaard

+1

Das ist die Syntax für eine Funktion, kein Import. Sie können mysettings als Argument zu einer Funktion hinzufügen, aber der Aufrufer der Funktion muss einen Wert dafür angeben. So funktioniert es auch für Pakete, es wird durch den Ausdruck auf oberster Ebene etwas magisch gemacht. Es gibt keine Möglichkeit zu sagen, "diesen Wert überall verfügbar zu machen" in Nix. –

Verwandte Themen