Derivation
Nix 언어로 표현한 Nix 패키지 빌드 명령
먼저 Nix 빠른 시작부터 따라가고, 개념 문서는 주로 보충 설명이 필요할 때 참고하기를 권합니다. 오른쪽의x를 누르면 모든 개념 문서에서 이 안내를 숨길 수 있습니다.
derivation은 Nix가 Nix 패키지를 실체화하는 데 사용하는 명령입니다. derivation은 Nix 언어의 특별한 derivation 함수를 사용하여 생성됩니다. derivation은 임의 개수의 다른 derivation에 의존할 수 있으며, 하나 이상의 최종 출력을 생성합니다. derivation과 이를 빌드하는 데 필요한 모든 의존성—직접 의존성, 그리고 그 의존성들의 모든 의존성 등—을 통틀어 클로저라고 합니다.
Derivation 출력
가장 일반적인 출력은 다음과 같습니다.
out: 가장 범용적인 출력lib: 라이브러리 출력용dev: 헤더 파일 같은 일반적인 개발 리소스man: 매뉴얼 페이지용
derivation과 이를 빌드하는 데 필요한 모든 의존성—직접 의존성, 그리고 그 의존성들의 모든 의존성 등—을 통틀어 패키지 클로저라고 합니다.
derivation을 Nix 패키지의 계획 또는 청사진으로 생각하면 이해하는 데 도움이 될 수 있습니다.
Nix 언어에서의 derivation
Nix 언어에서 derivation은 derivation 함수를 사용하여 생성됩니다. 다음은 derivation의 타입 시그니처를 Haskell 풍의 시그니처로 표현한 것입니다.1
derivation :: { system : String , name : String , builder : Path | Derivation , ?args : [String] , ?outputs : [String] } -> Derivation다음은 derivation의 예시입니다.
derivation { # A name for the derivation (whatever you choose) name = "hello-text"; # The system realising the derivation system = "x86_64-linux"; # The program realising the derivation builder = "bash"; # Arguments passed to the builder program args = ["-c" "mkdir $out && echo Hello world > $out/hello.txt"]};이것이 전부입니다! derivation 함수는 이 인수들만 받습니다. 하지만 args를 통해 전달하는 스크립트 로직은 얼마든지 복잡해질 수 있으므로, derivation은 훨씬 덜 단순해질 수 있습니다.
문자열 보간
Nix가 이 문자열을 보면…
{ buildPhase = '' mv ${pkgs.website}/favicon.ico '';}derivation의 문자열 출력은 항상 Nix 스토어 경로입니다
Derivation 출력
실체화
특수 변수
derivation을 작성할 때 알아 두어야 할 특수 변수가 두 가지 있습니다.
$out은 빌드 출력을 위한 디렉터리 구조의 루트를 나타냅니다.$src는 빌드 소스를 나타냅니다.
표준 환경
Nix 생태계의 derivation 대부분은 표준 환경의 mkDerivation 함수를 기반으로 합니다.
원시 derivation 함수로 derivation을 만드는 것도 가능하지만, 이를 감싸는 래퍼 함수를 사용하는 것이 훨씬 더 일반적입니다. 아마도 가장 흔히 사용되는 래퍼 함수는 stdenv.mkDerivation일 것입니다. 인수:
- 패키지의
name입니다. 대신pname과version을 지정하면name은 결국${pname}-${version}이 됩니다.
기타 derivation 함수
stdenv.mkDerivation 외에도 특정 언어, 프레임워크 등을 위한 맞춤형 derivation 래퍼가 많이 있습니다(그리고 그중 다수는 실제로 stdenv.mkDerivation을 감쌉니다). 몇 가지 예시는 다음과 같습니다.
Nix 생태계에서 이 밖에도 훨씬 더 많은 함수를 접하게 될 것입니다. 또한 언제든지 자신만의 derivation 함수를 자유롭게 만들 수 있으며, buildPythonApplication 같은 헬퍼 함수를 감쌀 수도 있습니다.