在Elixir中是否有可能根据Mix环境有条件地存在代码?

时间:2017-10-27 07:38:30

标签: elixir phoenix-framework mix

基本上像C / C ++中的#ifdef /#else /#endif 我想在mix test期间将一些代码放在最前面并在生产中删除,因此我不需要在一段经常调用的代码中测试Mix.env ==:test。

我知道这被认为是不好的做法,但它有可能吗?如何?

2 个答案:

答案 0 :(得分:2)

在构建版本时,Mix可用。在发布本身,它不是。如果您是肯定的,您希望从发布版本中删除代码,请使用宏:

defmodule StrippedInRelease do
  defmacro fun(do: block) do
    if Mix.env == :test do
      block # AST as by quote do: unquote(block)
    end
  end
end

并使用它:

require StrippedInRelease
StrippedInRelease.fun do
  def yo, do: IO.puts "¡yo!"
end

它将在编译时期间进行扩展,因此,作为块传递的所有内容都将在:test环境中定义,并在其他环境中被删除。

答案 1 :(得分:0)

有一个值得一提的变体-构建后加载特定于env的代码-这是我用来获取特定于env的种子文件的一种方法:

# Capture the mix environment at build time
defmacro mix_build_env() do
  Atom.to_string( Mix.env )
end

def seeds_path(repo) do
  mix_env = mix_build_env()
  # IO.puts(:stderr, "env:  #{inspect x} " )
  priv_path_for(repo, mix_env  <>  "_seeds.exs")
end