Skip to content

인자와 변수

GNU Hello를 위한 닉스 표현식은 함수입니다; 어딘가에서 채워져야할 인자들이 부족한 상황입니다. 닉스 패키지 모음에서, 이 작업은 pkgs/top-level/all-packages.nix 파일에서 이루어집니다. 이는 패키지를 위한 모든 닉스 표현식과 적절한 인자들이 호출됩니다. 여기에서 각 부분의 의미와 함께 all-packages.nix의 일부분을 소개합니다.

...

rec { 

  hello = import ../applications/misc/hello/ex-1  { 
    inherit fetchurl stdenv perl;
  };

  perl = import ../development/interpreters/perl { 
    inherit fetchurl stdenv;
  };

  fetchurl = import ../build-support/fetchurl {
    inherit stdenv; ...
  };

  stdenv = ...;

}
  1. 이 파일은 일련의 특성들을 정의하는데, 이것들은 모두 구체적인 제작물(예, 함수가 아님)입니다. 사실, 상호 회귀적인 특성 집합을 정의합니다. 이는, 이 특성들이 서로를 참조할 수 있음을 의미합니다. 상호 참조 가능함은 특히 패키지들이 서로를 "끼워 맞출 수" 있어야 하므로 우리가 원하는 바입니다.

  2. 여기서 GNU Hello를 위한 닉스 표현식을 가져옵니다. 가져오는 작업은 단순히 로드한 이후 특칭된 닉스 표현식을 반환하는 과정입니다. 사실상, GNU Hello에 해당하는 닉스 표현식 내용물 자체를 all-packages.nix에 넣을 수도 있습니다. 그렇게 해도 완벽히 동일하겠으나, all-packages.nix가 너무 길어질 수도 있습니다.

    ../applications/misc/hello/ex-1/default.nix가 아니라, ../applications/misc/hello/ex-1로 쓰고 있음을 주의하세요. 디렉터리를 가져오게 되면, 닉스는 자동적으로 /default.nix를 파일명으로 뒤에 붙입니다.

  3. 이 과정이 실제 합성이 일어나는 곳입니다. ../applications/misc/hello/ex-1에서 가져온 함수를, 함수가 기대하고 있는 fetchurl, stdenv, perl을 포함하는 집합과 함께 호출합니다. 주변 범주에서 이미 정의된 특성을 같은 이름으로 사용하고자 상속(inherit)을 다시 사용합니다 (fetchurl = fetchurl; 등으로 적어도 같습니다).

    이 함수 호출의 결과물은 닉스가 빌드할 수 있는 실제 제작물 입니다 (함수에 인자들을 채워넣었기 때문에, 반환되는 것은 함수의 본문입니다. 이것은 GNU Hello를 위한 닉스 표현식에 있는 stdenv.mkDerivation에 대한 호출입니다.)

    주의

    Nixpkgs는 없는 인자가 있는 경우 Nixpkgs 집합에서 적절한 것을 찾아 넣은 다음 함수를 가져오거나 호출하는 편리한 함수인 'callPackage`를 가지고 있습니다. 아래와 같이 사용합니다.

    hello = callPackage ../applications/misc/hello/ex-1 { };
    

    필요하다면 인자를 설정하거나 기존 옵션을 무시하도록 할 수 있습니다:

    hello = callPackage ../applications/misc/hello/ex-1 { stdenv = myStdenv; };
    
  4. 마찬가지로, Perl, fetchurl 그리고 표준 환경을 개시합니다.


Last update: November 4, 2021
Back to top