Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir “为什么?”;Mix.env();在布局中调用时,是否在生产中变为零?_Elixir_Phoenix Framework - Fatal编程技术网

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

Elixir “为什么?”;Mix.env();在布局中调用时,是否在生产中变为零?,elixir,phoenix-framework,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 %>

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

<%= 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不必存在于运行时中。它是一个构建工具,用于编译阶段。您可以使用以下函数替换
Mix.env()

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

因此,它将在编译时确定它所处的环境。

Mix
默认情况下不包括在OTP版本中。Elixir在通过
mix
运行时会隐式加载多个应用程序,包括但不限于
:mix
:runtime\u tools
:observer

我现在很难找到一个参考文献来证明这一点,如果有人知道这个参考文献,请在评论中分享,我会更新答案

虽然可以通过将
:mix
添加到
MyApp.Mixfile
[中的
:included\u applications
列表中来明确地将
:mix
包含到发布中,但正确的解决方案是依赖于由项目所有者控制的环境变量。也就是说,在一些
.rc
文件中,在生产主机上设置一个环境变量:

export MYAPP_PROD=true
或者在
systemctl
/
upstart
脚本中,或者在运行发行版时显式执行以下操作:

MYAPP_PROD=true bin/my_app foreground
并通过以下方式进行检查:



确切的错误信息是什么?为什么您希望首先在生产中提供
mix
@Dogbert我可能会猜到错误消息:它类似于“(UndefinedFunctionError)function Mix.env/0未定义(模块混合不可用)”@mudasobwa我为什么不呢?因为
dev
env中的Elixir隐式加载了几个未包含在生产发行版中的其他应用程序
Mix
就是其中之一,因为它首先是一个构建工具。@mudasobwa那么您对我的问题的解决方案是什么?
Mix不必存在于运行时中。
-->它是如何以开发模式存在于我的本地计算机上的同一布局文件中的?这就是您在本地计算机上编译它的地方。您可以将编译后的文件发送到生产环境。没有混合,因为那里不需要。假设我同意你的解决方案。但是,我如何从我的
layout/app.html
中调用
env
?这很容易出错。例如,在编译登台版本时,
MIX_ENV
设置为
prod
,您的登台实例会突然向GA报告。有关正确的解决方案,请检查我的答案。毕竟,编译宿主环境不应该负责在生产环境中设置环境。如果您还有其他问题,请询问其他问题。此外,“为什么这个代码不起作用”在这个问题上被明确禁止。另外,请澄清,当你写“生产”时,你的意思是什么。释放?部署释放?仅在本地设置环境?顺便说一句,
,除非[:prod]
中的Mix.env()也是完全错误的。不应该依赖于编译主机上设置的环境。另外,请注意,您的条件不是条件事实上,根据编译时间设置,代码要么包含在发行版中,要么包含在nor中。您当然需要理解编译时间和运行时之间的区别;通过edeliver部署到我的服务器的任何内容。这是什么版本?这是一个部署版本。那你在哪里建造?同一台服务器?如果是,此服务器安装了一个
mix
另外,请注意,您的条件不是条件,事实上,代码要么包含在发行版中,要么不包含,
--->是的,这就是我需要的。这会有什么不同:是一个真正的条件还是“包含或不包含”?
MYAPP_PROD=true bin/my_app foreground
<%= if System.get_env("MYAPP_PROD") do %>
    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?...
    </script>
<% end %>