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