とてもシンプルなものを持っているとしましょう。NixOS 構成ファイル:
{ config, pkgs, ... }:
{
imports =
[ # Include the results of the hardware scan.
./hardware-configuration.nix
];
# SOME STUFF
environment.systemPackages = with pkgs; [ emacs gitFull ];
# SOME STUFF
}
NixOSが実装していることを知っています。モジュールシステム、モジュールは.nix
ファイルです。各.nix
ファイルには有効な内容を含める必要があります。ニックスエクスプレス(たとえば、機能またはセット)これは、NixOS設定ファイル/etc/nixos/configuration.nix
自体がNix式を含むモジュールであることを意味します。
また、使用しているモジュールに他のモジュールのNix式が表示されるようにするには、組み込みimport
機能。
emacs
システムパッケージ(およびを含むリストgitFull
)の宣言をファイルに分割したいと思いますpackages.nix
。 NixOS設定ファイルを別々のモジュールに分割するには?
答え1
ニックス表現
ㅏニックスエクスプレスすべてのプログラミング言語表現と同様に、値または関数として評価されるものです。この場合、値はリストまたはセットでもかまいません。 Nixモジュール(拡張子を持つファイル)にはすべてのNix式を含めることができるため、NixOS構成ファイル()にはファイルの内容として単一のNix式が含まれると.nix
予想されます。/etc/nixos/configuration.nix
NixOS 構成ファイルには、次の形式の Nix 式が含まれています。
{config, pkgs, ...}: { /* various configuration options */ }
注意深く見てみると、これがわかります。機能、機能はフォームに従うからですpattern: form
。コレクションを取得してコレクションを返す関数であることもわかります。たとえば、関数がある場合はそれを呼び出してセットを返すf = {x, y}: {a = x + y;}
ことができます。f {x=1; y=2;}
{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
Nix式を評価し、パッケージのインストールなどを決定するプロセスでconfiguration.nix
属性セットを呼び出しconfig
ますpkgs
。
返されたコレクション内のプロパティを見つけるため、imports
同じ引数(など)を含むモジュールのすべてのNix式を評価します。imports
config
pkgs
Nix言語の観点から見ると、プロシージャは:containsコレクションを使用して関数を呼び出すことも、呼び出さないこともあるため、関数をパラメータpkgs
(または技術的にはそれ自体がパラメータであるコレクションのプロパティ)に渡す必要があります。いいえ、実行時にどの属性を参照しますか?packages.nix
pkgs
with pkgs
関数が以外の属性で呼び出される可能性があるため、省略記号も必要ですpkgs
。
pkgs
なぜ中にいないのですかconfiguration.nix
?持つことができますが、ファイルのどこでも参照しない場合は、省略記号で囲まれているので安全に省略できます。
外部関数を呼び出して属性を更新する
もう1つの方法は、一部のプロパティを含むコレクションと、そのコレクションに入れるプロパティの値を返す関数を作成することです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 ]
。