我将其添加到我的基本布局文件中:
<%= 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
答案 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