为什么在布局中调用“ Mix.env()”时在生产中变为零?

时间:2018-08-16 06:38:42

标签: elixir phoenix-framework

我将其添加到我的基本布局文件中:

<%= if Mix.env() in [:prod] do %>
    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?........................
    </script>
<% end %>

,由于据说是“ Mix.env()” nil,它在生产中崩溃了。

但是相同的代码在开发环境中的本地计算机上也可以工作。

如何解决?

更新1

但是,为什么这对开发和生产都有效?

  # /lib/my_module1.ex
  defmodule MyAppWeb.MyModule1 do
    use Plug.Builder

    unless Mix.env() in [:prod] do
      # some stuff here
      # all works, no exception thrown

2 个答案:

答案 0 :(得分:1)

运行时中不必存在混合。它是一个构建工具,用于编译阶段。您可以将Mix.env()替换为以下功能:

@env Mix.env()
def env, do: @env

因此它将确定在编译期间所处的环境。

答案 1 :(得分:0)

默认情况下,

ServerPort = res; 不包含在OTP版本中。 Elixir通过Mix运行时确实隐式加载了几个应用程序,包括但不限于mix:mix:runtime_tools

我很难找到一个参考来证明现在,如果有人知道该参考,请分享评论,我将更新答案。

虽然可以通过将:observer显式地包括在发布中,方法是将其添加到:mix中的:included_applications列表中。[请勿这样做! ],那么正确的解决方案是依靠由项目所有者控制的环境变量。也就是说,在生产主机上的一些MyApp.Mixfile文件中设置环境变量:

.rc

或在您的export MYAPP_PROD=true / systemctl脚本中,或在运行发行版时明确显示:

upstart

并使用System.get_env/1进行检查:

MYAPP_PROD=true bin/my_app foreground