【问题标题】:Is it possible in Elixir to have code conditionally present depending on Mix environment?Elixir 中是否可以根据 Mix 环境有条件地存在代码?
【发布时间】:2020-11-04 19:16:22
【问题描述】:

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

我知道这被认为是不好的做法,但它是否可能以及如何实现?

【问题讨论】:

  • 你想在哪个文件中添加这个? if Mix.env == :test do ... end 怎么样?
  • @Dogbert 将代码放入test/test_helper.exs 怎么样? :)
  • @mudasobwa:这就是我的想法,所有文档都说 Mix 在生产中不可用,但我对 Mix.env 的测试以某种方式在生产中工作。
  • 如何部署到 prod?
  • 使用酿酒厂,但忘了我说的话。我设置了一个名为 env = Mix.env() 的全局配置,并在生产环境中对其进行了测试。

标签: elixir phoenix-framework elixir-mix


【解决方案1】:

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

【讨论】:

  • 我相信quote do: unquote(block)block 是一样的。
【解决方案2】:

有一个变体值得一提 - 在构建后加载特定于 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

【讨论】:

    猜你喜欢
    • 2016-04-22
    • 1970-01-01
    • 2014-08-15
    • 2015-11-22
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    相关资源
    最近更新 更多