Elixir - 在 Mac 上设置 MIX_ENV 会产生 FunctionClauseError

Elixir - setting MIX_ENV on a Mac yields FunctionClauseError

我无法让我的 Elixir 应用程序从 Mac 上的本地环境读取 MIX_ENV 变量。例如,运行命令

$ MIX_ENV=prod iex -S mix

抛出以下错误:

** (FunctionClauseError) no function clause matching in String.split/3    

    The following arguments were given to String.split/3:

        # 1
        nil

        # 2
        " "

        # 3
        []

    Attempted function clauses (showing 4 out of 4):

        def split(string, %Regex{} = pattern, options) when is_binary(string)
        def split(string, "", options) when is_binary(string)
        def split(string, pattern, []) when is_tuple(pattern) or is_binary(string)
        def split(string, pattern, options) when is_binary(string)

    (elixir) lib/string.ex:407: String.split/3
    (stdlib) erl_eval.erl:680: :erl_eval.do_apply/6
    (stdlib) erl_eval.erl:888: :erl_eval.expr_list/6
    (stdlib) erl_eval.erl:240: :erl_eval.expr/5
    (stdlib) erl_eval.erl:232: :erl_eval.expr/5
    (stdlib) erl_eval.erl:888: :erl_eval.expr_list/6
    (stdlib) erl_eval.erl:411: :erl_eval.expr/5
    (stdlib) erl_eval.erl:126: :erl_eval.exprs/5

如果我在单独的步骤中设置 MIX_ENV,也会发生这种情况。

根据 https://elixir-lang.org/getting-started/mix-otp/introduction-to-mix.html 上的文档,在我看来我做的是正确的,但似乎我不是。我需要用不同的方式来设置吗?

如前所述,我正在开发 Mac,Mojave 10.14.6,我的 Elixir 版本是 1.8.1。

我会检查你的配置。对我来说很多时候这来自于期望设置环境变量的产品。

我猜你有一些看起来像这样的代码:

:my_app
|> Application.get_env(:some_config)
|> String.split(" ")
|> do_something_else()

然后在你的 config/config.exsconfig/dev.exs 你可能有这样的东西:

config :my_app, :some_config, "some value"

那么你的 config/prod.exs 可能是这样的:

config :my_app, :some_config, System.get_env("MY_ENV_VAR")

如果 MY_ENV_VAR 未设置,但您 运行 您的应用程序处于生产状态(例如 MIX_ENV=prod iex -S mix),Application.get_env(:my_app, :some_config) 将 return nil,然后您将尝试将其拆分为字符串。

这只是根据我的经验做出的猜测,但你的堆栈跟踪会让我相信我错了。