【问题标题】:How to pass command line arguments to Mix Release built如何将命令行参数传递给构建的 Mix Release
【发布时间】: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])"

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

【问题讨论】:

    标签: erlang elixir elixir-mix


    【解决方案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
    猜你喜欢
    • 2015-02-08
    • 2013-10-11
    • 2020-02-18
    • 1970-01-01
    • 2012-09-01
    • 2020-08-02
    • 2014-01-13
    • 2020-09-02
    相关资源
    最近更新 更多