0

我正在使用 distillery 打包一个 elixir 应用程序,并且我想在运行时访问当前环境(是它:dev:test还是 :prod)。

目标是在运行时检查环境,如下所示:

if Mix.env() == :prod do
  # do this only in production
end

将应用程序包含在版本中的缺点是什么mix

def application do
    [mod: {EvercamMedia, []}, extra_applications: [:runtime_tools, :os_mon, :recon, :mix]]
end
4

3 回答 3

2

用于mix检测生产环境显然是一种反模式。相反,一个人可能应该以

MY_APP_PROD=true release start

并使用系统环境检查如下图

if System.get_env("MY_APP_PROD") == "true" do
  ...
end
于 2021-12-02T17:12:08.783 回答
1

你不应该包含mix你的发布中。您有多种选择:

  • 使用在运行时设置的环境变量,然后:
    • 使用例如在代码中检查它System.fetch_env!
    • 将其签入config/runtime.exs不是 config/prod.exs;这也在编译时进行评估)。
  • 或者将 的值编译MIX_ENV到您的代码中。@Daniel 提供了一种方法来做到这一点。我提供另一个:
defmodule M do
  @build_env Mix.env()

  def env(), do: @build_env
end

这里的技巧是@build_env...在编译时评估语句(当 Mix可用时),设置属性。然后你可以从你的函数中返回它。

于 2021-12-02T21:25:08.477 回答
0

Mix 在生产中被禁用是有原因的,它是一个构建工具,你可以在这里阅读更多关于它的信息。

如果您只需要当前环境,那么您可以执行以下操作:

defmacro env() do
    quote do
      unquote(Mix.env())
    end
  end

但是您需要记住,此代码是在编译时评估的,并且不适用于运行时配置之类的东西。

于 2021-12-02T16:08:43.817 回答