/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? 가질 수 있지만 파일의 어느 곳에서도 참조하지 않는 경우 생략 부호로 둘러싸이므로 안전하게 생략할 수 있습니다.

외부 함수를 호출하여 속성 업데이트

또 다른 방법은 일부 속성이 포함된 컬렉션과 컬렉션에 넣을 해당 속성의 값을 반환하는 함수를 만드는 것입니다 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 ].

관련 정보