nix 빌드 실패를 진단하는 방법은 무엇입니까?
현재 표시되는 출력은 다음과 같습니다.
nix build -v
warning: dumping very large path (> 256 MiB); this may run out of memory
building '/nix/store/fdrm6kbm68vld3bhfjizv684ck725lyf-blog.drv'...
builder for '/nix/store/fdrm6kbm68vld3bhfjizv684ck725lyf-blog.drv' failed with exit code 1; last 5 log lines:
unpacking sources
unpacking source archive /nix/store/s7r5vlvp49ad6a9d5hqhsiaxw691iyhf-Blog
source root is Blog
patching sources
configuring
[0 built (1 failed), 0.0 MiB DL]
error: build of '/nix/store/fdrm6kbm68vld3bhfjizv684ck725lyf-blog.drv' failed
왜 빌드되지 않는지에 대한 로그/오류를 찾고 싶습니다.
다음에서https://stackoverflow.com/a/47264375/1663462:
build-cache-failures = true;
추가 를 시도했지만 default.nix
여전히 출력이 표시되지 않습니다.
nix-store --read-log
결과 nix-store --query-failed-paths
:
error: no operation specified
Try 'nix-store --help' for more information.
답변1
또한보십시오:
- nix 빌드 디버깅- 대화형 bash 셸에서 실패한 nix-build 디버깅
- nix-shell에서 stdenv 패키지 빌드nixpkgs 문서에서
- Nix-build-phases: 대화형으로 nix 빌드 단계 실행닉소스의 말에 따르면
- 개발 환경 nix-shell닉스 위키에서
- nixpkgs의 runPhase 함수
eval "${!curPhase:-$curPhase}"
cd "${sourceRoot:-.}"
- nixpkgs의 genericBuild 함수- 전화해
runPhase $curPhase
패키지의 빌드 프로세스를 디버그합니다.
바꾸다nix-build
nix-build -E 'with import <nixpkgs> {}; callPackage ./. {}'
실행하여 nix-shell
빌드 환경으로 들어갑니다.
nix-shell -E 'with import <nixpkgs> {}; callPackage ./. {}'
그런 다음 빌드 단계를 실행하십시오.
# run build in tempdir
cd $(mktemp -d)
# dont install to /nix/store
for n in $outputs; do eval export $n=$PWD/result-$n; done
# https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh
phases="${prePhases[*]:-} unpackPhase patchPhase ${preConfigurePhases[*]:-} \
configurePhase ${preBuildPhases[*]:-} buildPhase checkPhase \
${preInstallPhases[*]:-} installPhase ${preFixupPhases[*]:-} fixupPhase installCheckPhase \
${preDistPhases[*]:-} distPhase ${postPhases[*]:-}";
echo writing nix-build-phases.txt
for curPhase in $phases; do
echo "eval \"\${$curPhase:-$curPhase}\""
if [ "$curPhase" = unpackPhase ]; then
echo '[ -n "${sourceRoot:-}" ] && chmod +x "${sourceRoot}"'
echo 'cd "${sourceRoot:-.}"'
fi
done >nix-build-phases.txt
echo "please manually run the build phases in nix-build-phases.txt"
echo
cat nix-build-phases.txt
예 nix-build-phases.txt
eval "${unpackPhase:-unpackPhase}"
[ -n "${sourceRoot:-}" ] && chmod +x "${sourceRoot}"
cd "${sourceRoot:-.}"
eval "${patchPhase:-patchPhase}"
eval "${updateAutotoolsGnuConfigScriptsPhase:-updateAutotoolsGnuConfigScriptsPhase}"
eval "${configurePhase:-configurePhase}"
eval "${buildPhase:-buildPhase}"
eval "${checkPhase:-checkPhase}"
eval "${installPhase:-installPhase}"
eval "${fixupPhase:-fixupPhase}"
eval "${installCheckPhase:-installCheckPhase}"
eval "${distPhase:-distPhase}"
이 빌드 환경에서는 다음을 수행할 수 있습니다.
- 빌드 오류의 원인을 알아보세요(어떤 빌드 단계가 실패했나요?)
- 빌드 명령 수정(예: 재정의
buildPhase
: 이전 단계 인쇄 실행type buildPhase
, 이전 단계 복사, 단계 수정, 새 단계 붙여넣기) - 수정된 빌드 명령을 실행합니다. 이는 전체 재구축보다 빠를 수 있습니다.
참고: 빌더는 다양한 빌드 단계를 수행할 수 있습니다. 실제 빌드 단계는 prePhases
또는 같은 변수에 저장됩니다.preConfigurePhases
문제: 빌드 스크립트가 실행되어 set -e
첫 번째 오류가 발생하면 종료되지만 이로 인해 대화형 셸이 종료됩니다. 이는 bash 셸의 제한 사항이므로 이상적으로는 bash 디버거에서 빌드 스크립트를 실행하고, 첫 번째 오류에서 실행을 중지하고, 명령을 수정하고, 명령을 취소하고 반복하고, 상태를 확인할 수 있습니다.
# run build in tempdir
cd $(mktemp -d)
# dont install to /nix/store
for n in $outputs; do eval export $n=$PWD/result-$n; done
# https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh
phases="${prePhases[*]:-} unpackPhase patchPhase ${preConfigurePhases[*]:-} \
configurePhase ${preBuildPhases[*]:-} buildPhase checkPhase \
${preInstallPhases[*]:-} installPhase ${preFixupPhases[*]:-} fixupPhase installCheckPhase \
${preDistPhases[*]:-} distPhase ${postPhases[*]:-}";
# test
#patchPhase="echo test error in patchPhase; false"
donePhases=()
missingPhases=($phases)
for curPhase in $phases; do
# no. genericBuild does not "return 1" on error
#phases="$curPhase" genericBuild || break
echo
echo "# running $curPhase"
# FIXME this also traps suspend (Ctrl-Z)
trap '
echo "FIXME error in $curPhase"
echo "done phases:" ${donePhases[@]}
echo "missing phases:" ${missingPhases[@]}
echo "hit Enter to close the nix-shell"
read
' EXIT
set -e # exit on error
set -x # trace
eval "${!curPhase:-$curPhase}"
set +x
set +e
if [ "$curPhase" = unpackPhase ]; then
[ -n "${sourceRoot:-}" ] && chmod +x "${sourceRoot}"
cd "${sourceRoot:-.}"
fi
donePhases+=($curPhase)
missingPhases=(${missingPhases[@]:1})
done
답변2
읽기 로그가 작동해야 합니다. 파생 프로세스를 지정했습니까? nix-store --read-log /nix/store/fdrm6kbm68vld3bhfjizv684ck725lyf-blog.drv
답변3
--debug
추가 정보를 제공하는 옵션과 옵션이 있습니다 --print-build-logs
(설정은 가능 nix build
하지만 아님).nix-build
특정 문제에 관해서는 아마도 다음과 같은 오류가 있을 것입니다.https://github.com/NixOS/nix/issues/2176
추가 정보
https://releases.nixos.org/nix/nix-0.16/build/565033/download/1/manual/index.html#id494024
답변4
실패한 breakpointHook
파생을 추가하는 것도 nativeBuildInputs
강력한 기술입니다.cntr
파생 빌드가 실패하면 환경을 탐색합니다.
NixOS Discourse에 대해 강연해주신 jamesbrock에게 감사드립니다.단점은 다음과 같습니다.
a의 breakpointHook
에 패키지를 추가합니다 .nativeBuildInputs
mkDerivation
nativeBuildInputs = [ breakpointHook ];
설치센터
nix-env -i cntr
Nix 빌드 명령을 실행하고 실패하면 breakpointHook은 다음 메시지를 출력합니다.
build failed in installPhase with exit code 1
To attach install cntr and run the following command as root:
cntr attach -t command cntr-/nix/store/6vwxqrwq5h1fd3nw4mc61wgk7rppn2qw-jupyterlab-extended
그래서 우리는 명령을 실행합니다뿌리. 루트 사용자에게는 Nix 구성 파일에 설치한 PATH
명령이 없으므로 cntr
단일 사용자 설치를 위해 cntr에 대한 전체 경로를 제공하십시오.
sudo /home/$USER/.nix-profile/bin/cntr attach -t command cntr-/nix/store/6vwxqrwq5h1fd3nw4mc61wgk7rppn2qw-jupyterlab-extended
이제 우리는 잠자는 Knicks 컨테이너에 있습니다. 이 단계에서는 일반적인 도구를 사용하여 및 같은 경로 를
사용할 수 있지만 가 아닌 현재 디렉터리( )에 있습니다. (이렇게 사용할 수 있습니다.)$out
$TMPDIR
/var/lib/cntr
/
cd $(echo $out | cut -c2-)
여기에서 실행하여 cntr exec
빌드 환경을 완전히 로드합니다.
/home/$USER/.nix-profile/bin/cntr exec
이 $TMPDIR
디렉터리는 Nix가 빌드 10을 위한 임시 디렉터리를 만드는 곳입니다.
cd $TMPDIR
buildPhase
이제 우리는 완전히 빌드 컨텍스트에 있으며 셸에 입력하는 모든 명령은 포크가 실패했을 때 포크 단계(예를 들어) 중에 줄에 입력한 것처럼 나타납니다.
언급하다NixOS 토론에서:
또한 BreakpointHook에 대한 몇 가지 세부 정보를 추가하고 싶습니다. 이것은 매우 강력한 디버깅 후크입니다.@Mic92.
pkgs.breakpointHook를 buildInputs에 넣으면 작동합니다. 오류가 발생하면 정확한 "connect" 명령이 콘솔에 인쇄됩니다. 이 명령(cntr)을 사용하여 셸을 빌드 환경에 연결할 수 있습니다. 이를 사용하려면 cntr과 함께 sudo를 실행할 수 있어야 합니다(따라서 cntr 패키지를 먼저 설치해야 합니다;-)).
@Mic92 NixCon 프레젠테이션에서 더 흥미로운 세부 정보를 확인할 수 있습니다.Jörg 'Mic92' Thalheim - Nix 샌드박스 및 중단점 정보(NixCon 2018)
다음은 매뉴얼의 관련 부분에 대한 링크입니다.https://nixos.org/manual/nixpkgs/stable/#breakpointhook