재현성
같은 빌드 입력으로부터 같은 빌드 출력을 일관되고 반복적으로 만들어 낼 수 있는 능력
먼저 Nix 빠른 시작부터 따라가고, 개념 문서는 주로 보충 설명이 필요할 때 참고하기를 권합니다. 오른쪽의x를 누르면 모든 개념 문서에서 이 안내를 숨길 수 있습니다.
재현성은 같은 입력에 대한 연산이 같은 출력을 내는 소프트웨어 설계 개념입니다. 해시는 빌드의 입력을 바탕으로 만들어지므로 같은 입력이 같은 빌드 출력을 낸다는 점이 반드시 보장되어야 합니다. 이 때문에 이는 Nix에서 중요한 특성입니다.
{ stdenv, fetchGit }:
stdenv.mkDerivation { name = "my-package"; src = fetchgit { url = "https://github.com/DeterminateSystems/riff"; sha256 = "sha256-7mnx7J0AacL2P2mNuNNB+kKE7VR8nniVG+PSrwpZixE="; };}위 코드는 fetchgit과 mkDerivation이라는 두 derivation으로 구성되어 있습니다.
fetchgit의 출력이 특정 해시로 고정되어 있으므로 mkDerivation의 재현성이 보장됩니다. 또한 mkDerivation 자체는 네트워크에 접근할 수 없고 호스트로부터 밀폐되어 있으므로, 빌드에 불순한 요소가 존재할 수 없습니다.
fetchgit의 출력은 특정 해시로 고정되어 있으므로 보장됩니다. 네트워크에 접근할 수는 있지만, 가져온 결과가 사용자가 제공한 출력 해시와 일치하지 않으면 빌드에 실패합니다.
이처럼 Nix 빌드의 재현성이 마치 패키징 양파처럼 여러 겹으로 쌓여 있음을 알 수 있습니다.