mix dialyzerのエラーを一部無視させたい
ことしになってElixirを使い始めて,最近になってようやくmix dialyzerの有り難さが分かるようになった.有り難さがわかると同時に,このdialyzer先生は何が間違ってるのかちゃんと教えてくれないってこともわかってきた.間違ってるところは正しいっぽいが.
それが原因かどうかはわからないが,時々ライブラリがdialyzer先生を怒らせることがある.自分がやったところじゃないことに対しても怒ってくるdialyzer先生マジ理不尽.
これがあまり重要じゃないライブラリならライブラリを使うこと自体をやめれば良いのだが,にっちもさっちもいかないときがやはりある.僕が遭遇したケースはPhoenixで-no-htmlオプションを使用したときに何故か発生するエラー.
lib/phoenix/router.ex:2: Function call/2 has no local return
lib/phoenix/router.ex:325: The variable __@7 can never match since previous clauses completely covered the type 'error'
しかもこのエラーでググってみると,公式へのバグ報告は一応されてはいるものの,公式が「俺らはdialyzerの面倒をいちいち自分たちで確認しないからよろしくな!」なんて言っているから自分で面倒を見なきゃいけない.かといってPhoenixのコードを頑張って弄れたとしても,mix deps.getで吹き飛ぶわけで,チョットデキルマンにでもならない限りは根本解決なんかできやしない.
やり方
ってことで,流石になんか方法あるだろうと思ってdialyzer先生のHexDoc読んでみたら方法が書いてあった.mix.exsにdialyzer先生の設定を書き込んで,無視するエラー一覧を作れば良いだけらしい.
def project do
[
app: :something,
version: "0.1.0",
elixir: "~> 1.5",
elixirc_paths: elixirc_paths(Mix.env()),
compilers: [:phoenix, :gettext] ++ Mix.compilers(),
start_permanent: Mix.env() == :prod,
aliases: aliases(),
deps: deps(),
dialyzer: [ignore_warnings: "dialyzer.ignore-warnings"],
]
end
まぁ余計なのも並んでいるが、大事なのはdialyzer: [ignore_warnings: "dialyzer.ignore-warnings"]の行で,dialyzer.ignore-warningsというのが無視するエラー一覧のパス.もちろん相対パス.
lib/phoenix/router.ex:2: Function call/2 has no local return
lib/phoenix/router.ex:325: The variable __@7 can never match since previous clauses completely covered the type 'error'
あまりにもそのまま過ぎて驚いたのだけども,無視したいエラーはmix dialyzer実行して出てきた文そのままコピペすればいいっぽい.
というわけで以上でDone (passed successfully)