/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멀리 파일로) packages.nix. NixOS 구성 파일을 개별 모듈로 어떻게 분할합니까?

답변:


22

닉스 표현

닉스의 표현은 모든 프로그래밍 언어의 표현과 같다 : 아무것도 그 값이나 함수에 평가합니다. 이 경우 값은 목록 또는 집합 일 수도 있습니다. Nix 모듈 (확장자를 가진 파일 .nix)은 Nix 표현식을 포함 할 수 있으므로 NixOS 구성 파일 ( /etc/nixos/configuration.nix)은 단일 Nix 표현식을 파일 내용으로 포함 할 것으로 예상합니다 .

NixOS 구성 파일은 다음 형식의 Nix 표현식을 포함합니다.

{config, pkgs, ...}: { /* various configuration options */ }

당신이 자세히 보면, 당신은 A의 볼 수있는 기능 기능은 양식을하기 때문에 pattern: form. 또한 집합을 수락하고 집합을 반환하는 함수임을 알 수 있습니다. 예를 들어, 함수가 f = {x, y}: {a = x + y;}있으면로 호출 f {x=1; y=2;}하여 세트를 다시 가져올 수 {a=3;}있습니다.

전화 할 때 그 의미 그래서 nixos-rebuild switch, 뭔가 속성이 포함되어야합니다 세트로 NixOS 구성 파일 내부의 함수를 호출 configpkgs.

수입

의 예에 따라 ./hardware-configuration.nix패키지 목록을 별도의 모듈로 추출하는 간단한 방법 packages.nixenvironment.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 switchNix 표현식을 평가 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 ]A는 로 표현 , 그것은 세미콜론 후 표현에 세미콜론 전에 표현의 범위를 제공합니다. 그것 없이는 될 것 [ pkgs.emacs pkgs.gitFull ]입니다.


1
수입품은 어떻게 병합됩니까? 그들은 재귀 업데이트 또는 이와 유사한 것을 사용합니까?
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.