ニックス式
ニックス式は、値や関数には何も評価される:任意のプログラミング言語表現のようなものです。この場合の値は、リストまたはセットにすることもできます。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 ]
。