내가 아주 간단한 것을 가지고 있다고 가정 해 봅시다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
? 가질 수 있지만 파일의 어느 곳에서도 참조하지 않는 경우 생략 부호로 둘러싸이므로 안전하게 생략할 수 있습니다.
외부 함수를 호출하여 속성 업데이트
또 다른 방법은 일부 속성이 포함된 컬렉션과 컬렉션에 넣을 해당 속성의 값을 반환하는 함수를 만드는 것입니다 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 ]
.