如果引发编译时警告,是否有可能让编译器提前退出,使构建失败?

时间:2015-08-13 07:56:17

标签: elixir mix

我发现编译时警告非常有用,但我偶尔可能会错过它们,特别是如果它是在一个测试在CI服务器上运行的pull请求中。

理想情况下,我会在项目组合文件中指定一些会使编译器更严格的内容。

我希望这对所有混合任务都有效,我不想将标志传递给命令,因为这很容易忘记。

例如,对于带有编译器警告的项目,此命令应该失败

function toggleInfo() {
    if(document.getElementById('information').style.display == 'none'){
         $("#clicktoshow").toggle();
         $("#information").toggle();
   } else { 
       // do nothing
   }
}

应该是这个

mix clean && mix compile

3 个答案:

答案 0 :(得分:11)

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任务。

答案 1 :(得分:7)

可能在某种程度上。 --warnings-as-errors命令中有一个标记elixirc

☁  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

您可以在编译脚本中使用此返回代码来中断构建过程。

答案 2 :(得分:0)

我喜欢Michael Stalker的解决方案here

将警告始终作为错误处理 在TDD期间可能会很烦人,在这种情况下,您可能会在运行测试时快速重构代码。

相反,您可以像这样在混合环境中设置--warnings-as-errors标志为条件:

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

在测试时,警告将被忽略,但对于devprod编译,则不会被忽略。