Nix Ausdrücke
Ein Nix-Ausdruck ist wie jeder Ausdruck in einer Programmiersprache: alles, was zu einem Wert oder einer Funktion ausgewertet wird. Ein Wert kann in diesem Fall auch eine Liste oder eine Menge sein. Als Nix-Modul (Datei mit Endung.nix
) einen beliebigen Nix-Ausdruck enthalten kann, ist zu erwarten, dass die NixOS-Konfigurationsdatei ( /etc/nixos/configuration.nix
) einen einzelnen Nix-Ausdruck als Dateiinhalt enthält.
Die NixOS-Konfigurationsdatei enthält einen Nix-Ausdruck der Form:
{config, pkgs, ...}: { /* various configuration options */ }
Wenn Sie genau hinschauen, können Sie sehen, dass es sich um eine Funktion handelt , da Funktionen der Form folgen pattern: form
. Sie können auch sehen, dass es sich um eine Funktion handelt, die eine Menge akzeptiert und eine Menge zurückgibt. Wenn Sie beispielsweise eine Funktion haben f = {x, y}: {a = x + y;}
, können Sie sie als aufrufenf {x=1; y=2;}
und ein Set zurückerhalten {a=3;}
.
Das bedeutet, dass beim nixos-rebuild switch
Aufrufen die Funktion in der NixOS-Konfigurationsdatei mit der Menge aufgerufen wird, die Attribute config
und enthalten muss pkgs
.
Importe
Das folgende Beispiel zeigt ./hardware-configuration.nix
, wie Sie die Liste der Pakete auf einfache Weise in ein separates Modul extrahieren können packages.nix
, indem Sie die environment.systemPackages
Option rippen und ./packages.nix
in die imports
Option einfügen. Ihr /etc/nixos/configuration.nix
würde so aussehen:
{ config, ... }:
{
imports =
[ # Include the results of the hardware scan.
./hardware-configuration.nix
# Include the package list.
./packages.nix
];
# SOME STUFF
# SOME STUFF
}
Ihr /etc/nixos/packages.nix
würde so aussehen:
{ pkgs, ... }:
{
environment.systemPackages = with pkgs; [ emacs gitFull ];
}
Wie funktioniert das? Bei der Ausführung nixos-rebuild switch
wird der Prozess, der Nix-Ausdrücke auswertet und entscheidet, Pakete usw. zu installieren, configuration.nix
mit einer Reihe von Attributen aufgerufen, von denen einige Attribute sindconfig
und pkgs
.
Es findet Attribut imports
innerhalb des zurückgegebenen Satzes, so dass es jeden Nichts Ausdrucks in den Modulen auswertet , die imports
mit den gleichen Argumenten enthalten ( config
, pkgs
usw.).
Sie müssen pkgs
ein Argument (oder, technisch gesehen, ein Attribut einer Menge, das selbst ein Argument ist) einer Funktion in sich haben packages.nix
, da der Prozess aus Sicht der Nix-Sprache die Funktion mit der Menge möglicherweise so aufruft oder nicht enthält pkgs
. Wenn nicht, auf welches Attribut würden Sie sich bei der Ausführung beziehen with pkgs
?
Sie müssen auch Auslassungszeichen haben, da die Funktion möglicherweise nicht nur mit anderen Attributen aufgerufen wird pkgs
.
Warum gibt es pkgs
in configuration.nix
? Sie können es haben, aber wenn Sie sich in der Datei nicht darauf beziehen, können Sie es sicher weglassen, da die Auslassungspunkte sie sowieso einschließen würden.
Aktualisieren eines Attributs durch Aufrufen einer externen Funktion
Eine andere Möglichkeit besteht darin, eine Funktion zu erstellen, die eine Menge mit einem bestimmten Attribut und dem Wert dieses Attributs zurückgibt, den Sie eingeben würden environment.systemPackages
. Das ist dein configuration.nix
:
{ config, pkgs, ... }:
{
imports =
[ # Include the results of the hardware scan.
./hardware-configuration.nix
];
# SOME STUFF
environment.systemPackages = import ./packages.nix pkgs;
# SOME STUFF
}
Ihr packages.nix
:
pkgs: with pkgs; [ emacs gitFull ]
import ./packages.nix pkgs
bedeutet: Lade und gib den Nix-Ausdruck in ./packages.nix
und rufe ihn mit einem Argument auf, da es sich um eine Funktion handelt pkgs
. with pkgs; [ emacs gitFull ]
Wenn es sich um einen With-Ausdruck handelt , wird der Gültigkeitsbereich des Ausdrucks vor dem Semikolon auf den Ausdruck nach dem Semikolon gesetzt. Ohne es wäre es [ pkgs.emacs pkgs.gitFull ]
.
imports
ist nur eine Liste, so dass Sie Elemente an die Bedingung anhängen können, z. B.imports = [ ./foo.nix ./bar.nix ] ++ (if baz then [ ./quux.nix ] else []);