如何将命令行参数传递给构建的 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的主要内容,如果未能解决你的问题,请参考以下文章