1. 기본 모듈#

Author:

Daniel Baker @djacu

Editor:

Valentin Gagarin @fricklerhandwerk

모듈이란 무엇입니까?

  • 모듈은 속성 집합을 받아 속성 집합을 반환하는 함수입니다.

  • 모듈은 옵션을 선언하여 최종 결과에 어떤 속성이 허용되는지 알릴 수 있습니다.

  • 모듈은 자신이나 다른 모듈이 선언한 옵션에 값을 정의할 수 있습니다.

  • 모듈 시스템이 모듈을 평가하면 선언과 정의를 바탕으로 속성 집합이 만들어집니다.

가장 단순한 모듈은 아무 속성이나 받아 빈 속성 집합을 반환하는 함수입니다:

options.nix#
{ ... }:
{
}

값을 정의하려면 모듈 시스템이 먼저 어떤 값이 허용되는지 알아야 합니다. 이를 위해 어떤 속성을 설정하고 다른 곳에서 사용할 수 있는지 지정하는 옵션을 선언합니다.

1.1. 옵션 선언하기#

옵션은 최상위 options 속성 아래에 lib.mkOption으로 선언합니다.

options.nix#
{ lib, ... }:
{
  options = {
    name = lib.mkOption { type = lib.types.str; };
  };
}

참고

lib 인수는 모듈 시스템이 자동으로 전달합니다. 이 인수 덕분에 각 모듈의 함수 본문에서 Nixpkgs 라이브러리 함수를 사용할 수 있습니다.

모듈 시스템이 모듈에 임의의 인수를 전달할 수 있으므로 생략 부호 ...가 필요합니다.

lib.mkOption에 전달하는 인수의 type 속성은 옵션에 어떤 값이 유효한지 지정합니다. lib.types 아래에서 여러 타입을 사용할 수 있습니다.

여기서는 str 타입의 name 옵션을 선언했습니다: 값이 정의되면 모듈 시스템은 문자열을 기대합니다.

옵션을 선언했으니 이제 당연히 값을 지정하고 싶을 것입니다.

1.2. 값 정의하기#

옵션은 최상위 config 속성 아래에서 설정하거나 정의합니다:

config.nix#
{ ... }:
{
  config = {
    name = "Boaty McBoatface";
  };
}

옵션 선언에서는 문자열 타입의 name 옵션을 만들었습니다. 여기 옵션 정의에서는 바로 그 옵션을 문자열로 설정했습니다.

옵션 선언과 옵션 정의가 같은 파일에 있을 필요는 없습니다. 어떤 모듈이 최종 속성 집합에 기여할지는 모듈 시스템 평가를 구성할 때 지정합니다.

1.3. 모듈 평가하기#

모듈은 Nixpkgs 라이브러리의 lib.evalModules로 평가합니다. 이 함수는 속성 집합을 인수로 받으며, 그중 modules 속성은 병합하고 평가할 모듈의 목록입니다.

evalModules의 출력에는 평가된 모든 모듈에 대한 정보가 담기며, 최종 값은 config 속성에 나타납니다.

default.nix#
let
  pkgs = import <nixpkgs> { };
  result = pkgs.lib.evalModules {
    modules = [
      ./options.nix
      ./config.nix
    ];
  };
in
result.config

다음은 nix-instantiate --eval로 default.nix 파일을 파싱 및 평가하고 결과를 JSON으로 출력하는 헬퍼 스크립트입니다:

eval.bash#
nix-shell -p jq --run "nix-instantiate --eval --json --strict | jq"

모든 정의(definition)에 대응하는 선언(declaration)이 있는 한 평가는 성공합니다. 선언되지 않은 옵션 정의가 있거나 정의된 값의 타입이 잘못된 경우, 모듈 시스템이 오류를 발생시킵니다.

스크립트(./eval.bash)를 실행하면 우리가 설정한 내용과 일치하는 출력이 표시될 것입니다:

{
  "name": "Boaty McBoatface"
}