ニックス式
ニックス式は、値や関数には何も評価される:任意のプログラミング言語表現のようなものです。この場合の値は、リストまたはセットにすることもできます。Nixモジュール(拡張子がのファイル.nix)には任意のNix式を含めることができるため、NixOS構成ファイル(/etc/nixos/configuration.nix)にはファイルの内容として単一のNix式が含まれることが予想されます。
NixOS構成ファイルには、次の形式のNix式が含まれています。
{config, pkgs, ...}: { /* various configuration options */ }
よく見ると、関数は次の形式に従うため、関数であることがわかりますpattern: form。また、セットを受け入れてセットを返す関数であることがわかります。たとえば、functionがある場合は、f = {x, y}: {a = x + y;}as f {x=1; y=2;}を呼び出してsetを取得できます{a=3;}。
つまり、呼び出すときにnixos-rebuild switch、属性configとpkgs。
輸入品
の例に従って./hardware-configuration.nix、パッケージのリストを別のモジュールに抽出する簡単な方法packages.nixは、environment.systemPackagesオプションを取り出し./packages.nixてimportsオプションに入れることです。あなたの/etc/nixos/configuration.nixようになります:
{ config, ... }:
{
imports =
[ # Include the results of the hardware scan.
./hardware-configuration.nix
# Include the package list.
./packages.nix
];
# SOME STUFF
# SOME STUFF
}
あなたの/etc/nixos/packages.nixようになります:
{ pkgs, ... }:
{
environment.systemPackages = with pkgs; [ emacs gitFull ];
}
それはどのように機能しますか?あなたが実行するとnixos-rebuild switch、ニックス式を評価し、パッケージをインストールし、その通話にすることを決定プロセスconfiguration.nix、一連の属性としているそのうちのいくつかconfigとpkgs。
これは、属性見つけimports、それは、モジュール内のすべてのニックス式を評価して、返されたセットの内部をimports同じ引数(と含まれているconfig、pkgsなど)。
あなたは持っている必要がありますpkgs関数の引数(または、技術的に言えば、それ自体が引数であるセットの属性)としてpackages.nixニックス言語の観点から、プロセスのかもしれないまたはかもしれないが、そのセットで関数を呼び出していない、ので、を含むpkgs。そうでない場合、実行時にどの属性を参照しwith pkgsますか?
関数は単にではなく他の属性で呼び出される可能性があるため、省略記号も必要pkgsです。
なぜそこpkgsにないのconfiguration.nixですか?使用できますが、ファイル内のどこにも参照しない場合は、省略記号に含まれているため、安全に省略できます。
外部関数を呼び出して属性を更新する
別の方法は、何らかの属性と、その属性の値を設定したセットを返す関数を作成することですenvironment.systemPackages。これはあなた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
}
あなたのpackages.nix:
pkgs: with pkgs; [ emacs gitFull ]
import ./packages.nix pkgsつまり、Nix式をロードして返し、./packages.nix関数であるため、引数で呼び出しますpkgs。with pkgs; [ emacs gitFull ]であるとの表現は、セミコロンの後に式にセミコロンの前の式の範囲をもたらします。それがなければ、それは次のようになります[ pkgs.emacs pkgs.gitFull ]。