닉스 표현
닉스의 표현은 모든 프로그래밍 언어의 표현과 같다 : 아무것도 그 값이나 함수에 평가합니다. 이 경우 값은 목록 또는 집합 일 수도 있습니다. 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 구성 파일 내부의 함수를 호출 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 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 ]입니다.