Treating warnings as errors in Elixir's mix compile

Article autor
August 1, 2022
Treating warnings as errors in Elixir's mix compile
Elixir Newsletter
Join Elixir newsletter

Subscribe to receive Elixir news to your inbox every two weeks.

Oops! Something went wrong while submitting the form.
Elixir Newsletter
Expand your skills

Download free e-books, watch expert tech talks, and explore open-source projects. Everything you need to grow as a developer - completely free.

Table of contents

Warnings in Elixir are usually an important sign of a problem in the codebase. There is an easy way to make them gone.

Imagine that you define an alias to a module and then try to compile it:

defmodule App.User do
end

defmodule App.Users do
  alias App.User
end

...
iex> mix compile
iex> warning: unused alias User

or you're trying to call a function on a non-existing module:

defmodule App.Users do
  def fetch_user(id), do: User.get(id)
end

...

iex> mix compile
iex> warning: User.get/1 is undefined (module User is not available or is yet to be defined)

Both of these cases generate warnings. The latter is also indication of en error:

defmodule App.Users do
  def fetch_user(id), do: User.get(id)
end

...

iex> mix compile
iex> App.Users.fetch_user(1)
** (UndefinedFunctionError) function User.get/1 is undefined (module User is not available)
    User.get(1)

Some of the warnings will not cause an error, and some will. From my perspective, you should not tolerate any of these.

Treating warnings as errors in mix compile

Here is an easy way to treat every warning as an error during project compilation:

iex> mix compile --warnings-as-errrors
iex> warning: User.get/1 is undefined (module User is not available or is yet to be defined)

Compilation failed due to warnings while using the --warnings-as-errors option

Thanks to --warnings-as-errors, we expect compilation to fail whenever there is a warning in the app, and that's exactly why we see this message:

Compilation failed due to warnings while using the --warnings-as-errors option

Setting warning as errors flag in the mix.exs

Using the flag is cool, but you might forget to include it in every command that requires a project to be compiled. If you don't want to forget, here is an option that you can set in mix.exs:

def project do
  [
    ...
    elixirc_options: [
      warnings_as_errors: true
    ]
  ]
end

From now on, whenever you run a command that compiles the project, the warnings_as_errors flag will be used.

That's it! Happy coding 🤓

Work with a team that keeps learning and building better software every day.

Related posts

Dive deeper into this topic with these related posts

No items found.

You might also like

Discover more content from this category

How to install local npm package in a project

In some cases, like for testing purposes, you might want to use an npm package stored on a local machine. Here is how you can do that with one simple command.

Using Logger.info and Logger.debug in ExUnit tests

By default in the test env, Phoenix doesn't show Logger.debug/Logger.info outputs in the console.

Why & when you should use PostgreSQL deferred uniqueness constraints

Learn a trick that will allow you to manage item order in Postgres tables easier & faster.