Skip to content

빌드와 테스트

이제 Hello 빌드를 시도할 수 있습니다. 물론, nix-env -i hello를 할 수도 있습니다만 깨진 패키지일지도 모르는 것을 아직은 설치하고 싶지 않을 수도 있습니다. 패키지를 테스트하는 가장 좋은 방법은 nix-build를 활용하는 방법입니다. 이것은 닉스 표현식을 빌드하고 result라는 이름의 심볼릭 링크를 현재 디렉터리에 생성합니다:

$ nix-build -A hello
building path `/nix/store/632d2b22514d...-hello-2.1.1'
hello-2.1.1/
hello-2.1.1/intl/
hello-2.1.1/intl/ChangeLog
...

$ ls -l result
lrwxrwxrwx ... 2006-09-29 10:43 result -> /nix/store/632d2b22514d...-hello-2.1.1

$ ./result/bin/hello
Hello, world!
-A 옵션은 hello 특성을 선택합니다. 이는 name 특성을 통해 특정된 심볼릭 패키지 네임을 사용하는 것보다 빠르고(어쩌다 보니 그 이름도 hello 이지만), 모호하지 않습니다 (심볼릭 이름이 hello인 패키지는 몇 개가 있을 수도 있지만, 여기에서는 hello라틑 세트 이름을 지닌 특성은 단 한가지 입니다).

nix-build./result 심볼릭 링크를 쓰레기 수집기 루트에 등록합니다. 따라서, ./result 심볼릭 링크를 삭제하지 않는 한, 빌드 아웃풋은 시스템에서 안전하게 보관됩니다. nix-build-o 옵션을 주어 심볼릭 링크의 이름을 다른 것으로 할 수 있습니다.

닉스는 상호작용적(transactional) 과정을 가집니다. 한번 빌드가 성공적으로 완료되면, 닉스는 이를 데이터베이스에 기록합니다: 이는 out으로 알려지는 경로를 "유효한 것"으로 등록합니다. 만약 제작물을 다시 빌드하려고 시도하면, 닉스는 경로가 이미 유효한 것을 확인하고 즉각 성공합니다. 만약 빌드가 실패하면, 이는 닉스나 빌더가 실행 취소 되어 0이 아닌 종료 코드를 반환했기 때문이고 아웃풋 경로는 유효한 것으로 등록되지 않습니다. 만약 제작물을 재차 빌드하고자 시도하면, 닉스는 아웃풋 경로가 이미 존재하는 경우 (예, 빌더가 make install과정 중간쯤에 죽어버렸기 때문에) 해당 경로를 제거하고 재시도합니다. "음의 캐싱(negative caching)"이 존재하지 않음을 확인하시기 바랍니다: 닉스는 빌드가 실패했다는 것은 기억하지 않고 따라서 실패한 빌드는 언제든지 다시 반복될 수 있습니다. 이는 닉스가 영구적 실패(예, 소스 코드의 문법적 오류에 따른 컴파일러 에러)와 임시적 실패(예, 디스크 용량 초과 조건)를 구분할 수 없기 때문입니다.

닉스는 고정(locking)도 수행합니다. 만약 동시에 여러개의 닉스 빌드를 실행하고 동일한 제작물을 빌드하고자 시도하게 된다면, 첫 번째로 도달한 닉스가 빌드를 수행하고 나머지는 빌드가 완료될 때까지 블락(되거나 가능하면 다른 산출 과정을 수행함)됩니다:

$ nix-build -A hello
waiting for lock on `/nix/store/0h5b7hp8d4hqfrw8igvx97x1xawrjnac-hello-2.1.1x'

따라서 닉스를 병렬로 몇 개씩 수행하는 것은 언제나 안전한 작업입니다 (말하자면, make과 같은 경우는 이것을 지원하지 않습니다).

So it is always safe to run multiple instances of Nix in parallel (which isn’t the case with, say, make).


Last update: November 4, 2021
Back to top