失敗したnixビルドを診断する方法は?

失敗したnixビルドを診断する方法は?

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-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

おすすめ記事