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.exs
或 config/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
,然后您将尝试将其拆分为字符串。
这只是根据我的经验做出的猜测,但你的堆栈跟踪会让我相信我错了。
我无法让我的 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.exs
或 config/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
,然后您将尝试将其拆分为字符串。
这只是根据我的经验做出的猜测,但你的堆栈跟踪会让我相信我错了。