이 사이트는 의 를 yeokja로 기계 번역한 비공식 한국어판입니다. 정확한 내용은 원문을 확인하세요.

Derivation

Nix 언어로 표현한 Nix 패키지 빌드 명령

개념/Derivation

먼저 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 type signature
derivation ::
{ system : String
, name : String
, builder : Path | Derivation
, ?args : [String]
, ?outputs : [String]
} -> Derivation

다음은 derivation의 예시입니다.

Example 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가 이 문자열을 보면…

my-file.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 같은 헬퍼 함수를 감쌀 수도 있습니다.

Footnotes

  1. 이 아이디어를 제공해 주신 Ian Henry에게 감사드립니다. ↩