/etc/nixos/configuration.nixを個別のモジュールに分割する方法は?


14

非常に単純な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ファイルには、有効なNix式(関数またはセットなど)が含まれている必要があります。これは、NixOS構成ファイル/etc/nixos/configuration.nix自体がモジュールであり、Nix式を含むことを意味します。

また、別のモジュールのNix式を、使用しているモジュールから見えるようにするために、組み込みimport関数を使用できることも知っています

システムパッケージの宣言(emacsとを含むリストgitFull)をfile に分割しますpackages.nix。NixOS構成ファイルを個別のモジュールに分割するにはどうすればよいですか?

回答:


22

ニックス式

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

輸入品

の例に従って./hardware-configuration.nix、パッケージのリストを別のモジュールに抽出する簡単な方法packages.nixは、environment.systemPackagesオプションを取り出し./packages.niximportsオプションに入れることです。あなたの/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、一連の属性としているそのうちのいくつかconfigpkgs

これは、属性見つけimports、それは、モジュール内のすべてのニックス式を評価して、返されたセットの内部をimports同じ引数(と含まれているconfigpkgsなど)。

あなたは持っている必要があります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関数であるため、引数で呼び出しますpkgswith pkgs; [ emacs gitFull ]であるとの表現は、セミコロンの後に式にセミコロンの前の式の範囲をもたらします。それがなければ、それは次のようになります[ pkgs.emacs pkgs.gitFull ]


1
インポートはどのようにマージされますか?recursiveUpdateなどを使用していますか?
AIJ

1
条件付きインポートを行う方法はありますか?
CMCDragonkai

1
@CMCDragonkaiの値importsは単なるリストであるため、条件に要素を追加できます。たとえばimports = [ ./foo.nix ./bar.nix ] ++ (if baz then [ ./quux.nix ] else []);
Warbo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.