Можно ли заставить компилятор выйти раньше, если сборка завершится ошибкой, если возникнет предупреждение о времени компиляции?

Я нахожу предупреждения во время компиляции очень полезными, но иногда я могу их пропустить, особенно если это запрос на вытягивание, когда тесты выполняются на сервере CI.

В идеале я бы указал что-то в файле микса проекта, что сделало бы компилятор более строгим.

Я хочу, чтобы это действовало для всех задач микширования, и я не хочу передавать флаг команде, так как об этом легко забыть.

Например, в проекте с предупреждением компилятора эта команда должна завершиться ошибкой.

mix clean && mix compile

Как и этот

mix clean && mix test

person lpil    schedule 13.08.2015    source источник


Ответы (3)


Возможно до некоторой степени. В команде elixirc есть флаг --warnings-as-errors.

☁  hello_elixir [master] ⚡ elixirc
Usage: elixirc [elixir switches] [compiler switches] [.ex files]

  -o               The directory to output compiled files
  --no-docs        Do not attach documentation to compiled modules
  --no-debug-info  Do not attach debug info to compiled modules
  --ignore-module-conflict
  --warnings-as-errors Treat warnings as errors and return non-zero exit code
  --verbose        Print informational messages.

** Options given after -- are passed down to the executed code
** Options can be passed to the erlang runtime using ELIXIR_ERL_OPTIONS
** Options can be passed to the erlang compiler using ERL_COMPILER_OPTIONS

Для такого модуля с предупреждением:

defmodule Useless do
  defp another_userless, do: nil
end

При компиляции без флага:

☁  01_language [master] ⚡ elixirc useless.ex
useless.ex:2: warning: function another_userless/0 is unused
☁  01_language [master] ⚡ echo $?
0

Вы получите код возврата 0.

Но когда вы компилируете с флагом --warnings-as-errors, он возвращает код выхода 1.

☁  01_language [master] ⚡ elixirc --warnings-as-errors useless.ex
useless.ex:1: warning: redefining module Useless
useless.ex:2: warning: function another_userless/0 is unused
☁  01_language [master] ⚡ echo $?
1

Вы можете использовать этот код возврата в своем скрипте компиляции, чтобы прервать процесс сборки.

person Lenin Raj Rajasekaran    schedule 13.08.2015

В вашем mix.exs:

def project do
  [...,
   aliases: aliases]
end

defp aliases do
  ["compile": ["compile --warnings-as-errors"]]
end

Затем mix compile передаст --warnings-as-errors подзадаче compile.elixir.

Это также работает для mix test, так как он неявно запускает задачу compile.


Если вы не добавите псевдоним, вы все равно можете запустить mix compile --warnings-as-errors, и он сделает то, что вы ожидаете, но mix test --warnings-as-errors не сделает то, что вы ожидаете, так как флаг не достигает задачи compile.elixir.

person TalkLittle    schedule 13.05.2016
comment
Вы также можете использовать elixirc_options: [warnings_as_errors: true]. - person bla; 20.04.2018
comment
Если вы используете mix для компиляции кода Erlang, вам понадобится erlc_options: [:warnings_as_errors] - person Roger Lipscombe; 07.01.2019

Мне нравится решение Майкла Сталкера здесь.

Обработка предупреждений как ошибок всегда может раздражать во время TDD, когда вы можете быстро рефакторить код во время выполнения тестов.

Вместо этого вы можете сделать флаг --warnings-as-errors условным для среды Mix следующим образом:

defmodule SomeProject.MixProject do
  use Mix.Project

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

  defp treat_warnings_as_errors?(:test), do: false
  defp treat_warnings_as_errors?(_), do: true
end

Предупреждения будут игнорироваться при тестировании, но не для компиляции dev или prod.

person s3cur3    schedule 15.01.2020