Elixirコンパイラのwarnings_as_errorsオプションを使って確実にコンパイルする



Elixirコンパイラの`warnings_as_errors`オプションを有効にすると、 警告をエラーとして扱うことができ、コンパイル時に警告が発生した場合にコンパイルが失敗するようになります。

未使用の関数などの問題を確実に捕捉することができますし、コードの異常をより早く検知できます。

https://qiita.com/torifukukaiou/items/17d55cf896c24b13350e

## コマンドラインの例

```sh
mix compile --warnings-as-error
```

https://hexdocs.pm/mix/Mix.Tasks.Compile.Elixir.html#module-command-line-options

## Mixプロジェクトの例

```elixir
defmodule MyProject.MixProject do
  use Mix.Project

  #...

  def project do
    [
      elixirc_options: [warnings_as_errors: warnings_as_errors(Mix.env())]
    ]
  end

  defp warnings_as_errors(:test), do: false
  defp warnings_as_errors(_), do: true

  #...
end
```

https://hexdocs.pm/mix/main/Mix.Tasks.Compile.Elixir.html#module-configuration

## `test/test_helper.exs`の例

例えばテスト環境のみで有効にしたい場合は、`test/test_helper.exs`で[Code.put_compiler_option/2]を使用してコンパイラの設定を必要に応じて変更できます。

```elixir:test_helper.exs
Code.put_compiler_option(:warnings_as_errors, true)
```

https://hexdocs.pm/elixir/main/Code.html#put_compiler_option/2


いくつかの[Nerves]関連パッケージで`test/test_helper.exs`で`warnings_as_errors`オプションを有効化しています。

https://github.com/nerves-project/nerves_runtime/blob/141ba27012c5bcdccfbb332c21646f0581aa8f7d/test/test_helper.exs#L3

[Dashbit]ではCIで活用しているようです。`mix compile --warnings-as-errors`に加えて、[`mix deps.unlock --check-unused`]と[`mix format --check-formatted`]も使っているとのことです。

```
MIX_ENV=test mix deps.compile
MIX_ENV=test mix compile --warnings-as-errors
mix test --warnings-as-errors
```

```
mix deps.unlock --check-unused
mix format --check-formatted
```

https://dashbit.co/blog/tests-with-warnings-as-errors

## ご参考までに

https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian

https://qiita.com/piacerex/items/e0b6e46b1325bb931122

https://qiita.com/torifukukaiou/items/1edb3e961acf002478fd

https://qiita.com/piacerex/items/e5590fa287d3c89eeebf

[Dashbit]: https://dashbit.co/
[Elixir]: https://elixir-lang.org/
[Erlang]: https://www.erlang.org/
[Phoenix]: https://www.phoenixframework.org/
[Nerves]: https://hexdocs.pm/nerves
[Livebook]: https://livebook.dev/
[IEx]: https://elixirschool.com/ja/lessons/basics/basics/#%E5%AF%BE%E8%A9%B1%E3%83%A2%E3%83%BC%E3%83%89
[Node | hexdocs]: https://hexdocs.pm/elixir/Node.html
[otp_distribution | elixirschool]: https://elixirschool.com/ja/lessons/advanced/otp_distribution
[Node.ping/1]: https://hexdocs.pm/elixir/Node.html#ping/1
[Node.connect/1]: https://hexdocs.pm/elixir/Node.html#connect/1
[Node.spawn/2]: https://hexdocs.pm/elixir/Node.html#spawn/2
[Node.list/0]: https://hexdocs.pm/elixir/Node.html#list/0
[Node.set_cookie/2]: https://hexdocs.pm/elixir/Node.html#set_cookie/2
[Node.get_cookie/0]: https://hexdocs.pm/elixir/Node.html#get_cookie/0
[epmd]: https://www.erlang.org/doc/man/epmd.html
[Elixirの分散処理(Node)とMnesia]: https://qiita.com/sand/items/c5c9dab1dce3d5c526ee
[Elixir Distribution, ELI5]: https://medium.com/@pawel_dawczak/elixir-distribution-eli5-309193004119
[Node.start/3でエラーが出る場合にはepmdをバックグラウンド起動する]: https://qiita.com/zacky1972/items/cb3aa801a179322c56d6
[コマンドラインインタプリタ]: https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF
[端末エミュレータ]: https://ja.wikipedia.org/wiki/%E7%AB%AF%E6%9C%AB%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF
[メッシュネットワーク]: https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%83%E3%82%B7%E3%83%A5%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF
[Distributed Erlang]: https://www.erlang.org/doc/reference_manual/distributed.html
[ホスト名]: https://ja.wikipedia.org/wiki/%E3%83%9B%E3%82%B9%E3%83%88%E5%90%8D
[Code.put_compiler_option/2]: https://hexdocs.pm/elixir/main/Code.html#put_compiler_option/2
[`mix format --check-formatted`]: https://hexdocs.pm/mix/Mix.Tasks.Format.html
[`mix deps.unlock --check-unused`]: https://hexdocs.pm/mix/Mix.Tasks.Deps.Unlock.html