問題
rebar3でコマンドを実行する時に
===> Uncaught error in rebar_core. Run with DEBUG=1 to see stacktrace or consult rebar3.crashdump
が出ました。 解決してみました。
細かいバックグラウンド
- Macを使ってます
- チームメンバーのgitレポをクローンしてrebar3を使ってました、特に問題なかった(xref, dialyzerなど)
-
./rebar3 pkgs
でパッケージングしてみたところ、バグった - エラーを見て環境変数関連のエラーメッセージがあった
error:/User/先輩/のファイル/が欲しい
- 推測:rebar3をビルドする環境(依存するファイルなど)が変わったので、怒られたのでは
- 対策:自分でビルドしてpkgさせます
- 現在ここ:オフィシャルのgitレポから最新のレポ3.4.7をクローンして、ビルドして、
./rebar3 clean
を実行しようとするところ、上記なエラーが出ました
TL;DR
- ローカルでビルドしたrebar3のバージョンが
3.4.7+build.3966.refbXXXXXXX
です - オフィシャルサイトのバイナリーのバージョンが
3.4.7
です - 依存するappの中にバージョンが
X.X.X
という文字なしのvsnを想定するappがあります - オフィシャルサイトのバイナリーを使えばエラーを解消できます
詳しいデバッグ手順
まず
DEBUG=1 ./rebar3 clean
でスタックトレースを拝見します
===> Evaluating config script "/WORKINGDIR/_build/default/lib/hackney/rebar.config.script"
===> Uncaught error in rebar_core. Run with DEBUG=1 to see stacktrace or consult rebar3.crashdump
===> Uncaught error: {badmatch,
{error,
{40,file,
{error,
{badmatch,
["3","4","7+build","3966","refbXXXXXXX"]},
[{erl_eval,expr,3,[]}]}}}}
全く原因がわからないのでグーグル先生に聞いたところ、このイシューを見つけました。中に依存するappのrebar.config.scriptに問題がありと説明し、ワークアラウンドも載っています。
今回エラーが出たのはhackneyのrebar.config.scriptです。
IsRebar3 = case application:get_key(rebar, vsn) of
{ok, VSN} ->
[VSN1 | _] = string:tokens(VSN, "-"),
[Maj, Min, Patch] = string:tokens(VSN1, "."),
(list_to_integer(Maj) >= 3);
undefined ->
false
end
...
ここでstring:tokens/2
で三つのtermをMaj、Min、Patchを通して取り出そうとしています。
しかしローカルでビルドしたrebar3のバージョンが、、、、
まずrebar3のバージョンを確認しましょう
./rebar3 report
Rebar3 report
version 3.4.7+build.3966.refbXXXXXXX
generated at 2017-12-14T04:35:25+00:00
...
このvsnにstring:tokens
を適用すると["3","4","7+build","3966","refb7c021b3"]
、五つのtermを含むリストが帰ってきます。なのでbadmatch
になります。
イシューではrebar.config.scriptを修正することでワークアラウンドするようと提案しましたが、一々問題のあるscriptを修正するのがキリがないなあと感じ、大人しくオフィシャルサイトのバイナリーを使うことにしました。
オフィシャルサイトのバイナリーで./rebar3 report
を実行してみると
./rebar3 report
Rebar3 report
version 3.4.7
generated at 2017-12-14T03:07:34+00:00
バッチリです、rebar3のコマンドも無事実行できました。/rebar3 pkg
も実行できるようになりました。