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

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

とてもシンプルなものを持っているとしましょう。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と 。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 switchNix式を評価し、パッケージのインストールなどを決定するプロセスでconfiguration.nix属性セットを呼び出しconfigますpkgs

返されたコレクション内のプロパティを見つけるため、imports同じ引数(など)を含むモジュールのすべてのNix式を評価します。importsconfigpkgs

Nix言語の観点から見ると、プロシージャは:containsコレクションを使用して関数を呼び出すことも、呼び出さないこともあるため、関数をパラメータpkgs(または技術的にはそれ自体がパラメータであるコレクションのプロパティ)に渡す必要があります。いいえ、実行時にどの属性を参照しますか?packages.nixpkgswith 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関数なので引数を使用して呼び出しますpkgswith pkgs; [ emacs gitFull ]表情で、セミコロンの前の式の範囲をセミコロンの後の式に取得します。それなしで[ pkgs.emacs pkgs.gitFull ]

関連情報