在 Elixir 中是否可以根据 Mix 环境有条件地存在代码?
Is it possible in Elixir to have code conditionally present depending on Mix environment?
基本上像#ifdef
/#else
/#endif
中的C/C++
我希望一些代码在 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
基本上像#ifdef
/#else
/#endif
中的C/C++
我希望一些代码在 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