如何将命令行参数传递给构建的 Mix Release

Posted

技术标签:

【中文标题】如何将命令行参数传递给构建的 Mix Release【英文标题】:How to pass command line arguments to Mix Release built 【发布时间】:2021-12-25 04:03:06 【问题描述】:

我正在尝试将命令行参数传递给我的 elixir 版本。我已经使用

构建了版本
MIX_ENV=prod mix release

现在,我无法使用 start 命令传递任何命令行参数。

_build/prod/rel/prod/bin/prod start arg1 arg2

使用eval 我已经实现了传递参数,但它会在一段时间后停止。

_build/prod/rel/prod/bin/prod eval "Hello.nodes([3, :node1])"

有什么方法可以通过启动标志传递参数?

【问题讨论】:

【参考方案1】:

使用 eval 我已经实现了传递参数,但它在一个 同时。

_build/prod/rel/prod/bin/prod eval "Hello.nodes([3, :node1])"

来自docs:

eval 命令启动它自己的虚拟机实例,但没有 启动版本中的任何应用程序,但不启动 分配。例如,如果您需要在之前做一些准备工作 运行实际系统,例如迁移数据库,eval 可以是 很合身。请记住您在评估期间可能使用的任何应用程序 必须显式加载和/或启动。

我猜您的 eval 试图使用您在执行 eval 之前未明确加载的应用程序。

有什么方法可以通过启动标志传递参数?

没有记录,但有多种方式可以配置发布:

https://elixir-lang.org/getting-started/mix-otp/config-and-releases.html

也许escript 更合适?

escript 支持运行简短的 Erlang 程序,而无需 必须先编译它们,并且是一种简单的方法来检索 命令行参数。

可以将 escript(s) 与 Erlang 运行时系统捆绑在一起,使其自给自足且可重定位。

【讨论】:

我同意 escript 是可行的方法,但我使用的是 distillery 和 edeliver,它们可以在远程主机上编译和执行应用程序。我会坚持下去,因为它让生活更轻松。 @OwaisQayum,你知道 mix 本身现在可以创建发布,并且可以使用名为 config/runtime.exs 的文件在运行时读取环境变量(elixir 1.11+),然后设置应用程序变量,可以通过您的代码查找?因此,您可以设置环境变量,而不是传递命令行参数:MY_INPUT=hello _build/prod/rel/prod/bin/prod start

以上是关于如何将命令行参数传递给构建的 Mix Release的主要内容,如果未能解决你的问题,请参考以下文章

如何将命令行参数传递给 WinForms 应用程序?

如何将命令行参数传递给 c 程序

将命令行参数传递给颤振应用程序

在 Eclipse(Pydev) 中将命令行参数传递给 Python 脚本

如何将命令行参数传递给 PowerShell ps1 文件

如何将命令行参数传递给 Node.js 程序?