是否可能在Elixir中根据混合环境有条件地显示代码



基本上类似于C/C中的#ifdef/#else/#endif++我希望一些代码顶部在mix test期间出现,并在生产中删除,所以我不需要在一段经常调用的代码中测试Mix.env == :test

我知道这被认为是不好的做法,但这可能吗?怎么可能?

在构建发布时,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环境中定义,并在其他环境中剥离。

有一个值得一提的变体-在构建后加载特定于环境的代码-下面是我用来获取特定于环境种子文件的变体:

# 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

最新更新