比方说,我刚刚推出了一个全新的VPS服务器,我还没有在它上安装任何东西。
我已经在我的本地机器上编译并构建了一个凤凰应用程序的生产发行版,它与VPS服务器、Linux发行版和版本版完全相同。
在目录_build/prod/rel/my_app123中生成了4个子目录:
将rel/my_ an 123/的内容(即这4个子目录)复制到VPS中是否就足以运行应用程序了?
或者我也会安装一些额外的东西吗?灵丹妙药和二郎?来自mix.exs的生产依赖关系如何?或者,这些内容是否已被包含并编译到发行版中?
假设我的web应用程序没有"js“、"css”等类似的文件,并且不使用数据库。
发布于 2022-05-28 03:08:21
当您运行mix release时,它将有关MIX_ENV的所有Elixir/Erlang依赖项打包到发布目录、您在构建中使用的erlang束运行时/VM以及在mix.exs中的mix项目中指定的任何文件。
因为引导加载代码的BEAM运行时和代码包含在发行版中,所以不需要在目标计算机上安装Elixir或Erlang。
不包括的内容包括:
举个例子,我的一个项目的发行版是在阿尔卑斯使用Docker构建的,所以我们只需要担心CPU的兼容性。在我们的例子中,我们确实需要确保我们的应用程序绑定到的一些外部的非Elixir依赖项包含在docker映像中。
RUN apk add --no-cache libstdc++ openssl ncurses-libs wkhtmltopdf xvfb \
fontconfig \
freetype \
ttf-dejavu(忽略wkhtmltopdf不受欢迎的事实,我们正在研究它。但就目前而言,它是我们所依赖的一种非灵丹妙药)。
如果您构建的是一个EC2实例,而不是使用Docker,那么您只需要确保您的发布版本构建在与生产类似的操作系统上,并确保production (映像)在部署时具有那些非药物依赖关系,可能使用apt或另一个包管理器。对于VPS,非灵丹妙药依赖的解决方案将取决于它们是否有自定义基本机器映像的选项(可能使用封隔器或可抗)。
由于您可能在注释中对此感到有点困惑,是的,MIX_ENV=prod mix release将构建您的所有产品Elixir/Erlang依赖项,并将它们包含在/_build/prod文件夹中。
我在发行版中包含了整个./prod文件夹,但是它看起来像是协议合并二进制文件,而lib文件夹.Beam文件都在rel文件夹中,所以这有点不必要。
发布于 2022-05-27 12:25:31
如果您做了默认构建,目标将在您的_build目录中,包含配置环境和应用程序的子目录,例如_build/dev/rel/your_app/。该目录应该包含运行应用程序所需的所有内容--运行mix release后的提示符提供了一些线索,说明如下:
Release created at _build/dev/rel/your_app!然而,我发现将应用程序压缩到一个可移植的文件中更有用(是的,我同意关于如何做到这一点的细节并不一定是您在阅读Elixir版本时看到的第一件事)。诀窍是通过充实mix.exs选项来定制您的releases --这通常是通过一个专用的私有函数来完成的,但是如何提供这些选项的组织则取决于您自己。
我发现通常有用的是生成一个压缩的.tar.gz文件。这可以通过指定include_executables_for选项和steps来实现。看起来是这样的:
# mix.exs
defmodule YourApp.MixProject do
use Mix.Project
def project do
[
# ...
releases: releases()
# ...
]
end
defp releases do
[
my_app: [
include_executables_for: [:unix],
steps: [:assemble, :tar]
]
]
end当您以这种方式配置应用程序时,运行mix release将生成一个很好的可移植文件,其中包含应用程序所需的一切。解压缩这个文件是了解应用程序所需要的一切的教育。默认情况下,该文件将在像_build/dev/yourapp-1.0.0.tar.gz这样的位置创建。您可以通过为应用程序指定一个path来配置构建路径。有关更多选项,请参见Mix.Release。
https://stackoverflow.com/questions/72398423
复制相似问题