无法访问主要的Elixir项目中的依赖配置

5

我有一个名为 world_app 的项目,我将其作为依赖项添加到了 hello_app 中(如果相关的话,我已经将其添加为本地依赖项)。


注:dependency即依赖项。
defp deps do
  [
    {:world_app, path: "../world_app"}
  ]
end

world_app有一个config.exs文件,其中包含以下配置:

config :world_app, some_config: "config_string"

当我尝试在hello_app中获取在world_app中定义的配置变量时出现了问题(我在hello_app中运行了iex -S mix)。

iex(1)> Application.get_all_env(:world_app)
[included_applications: []]

iex(2)> Application.get_env(:world_app, :some_config)
nil

然而,当我在 world_app 中做同样的事情时,我能看到变量。

iex(1)> Application.get_all_env(:world_app)
[some_config: "config_string", included_applications: []]

iex(2)> Application.get_env(:world_app, :some_config)
"config_string"

我一直以为可以从父应用程序访问依赖项的配置;我是否漏掉了什么关键的东西?

我正在使用Elixir 1.5.3和erlang 20。

2个回答

3

依赖项的配置不会自动导入。在Umbrella项目中,所有子项目都可以看到彼此的配置,因为根配置包含这个神奇的行:

import_config "../apps/*/config/config.exs"

它会导入所有子模块的配置文件,并且反过来,所有子模块都指向根配置文件 mix.exs
defmodule ChildProject.MixProject do
  use Mix.Project

  def project do
    [
      (...)
      config_path: "../../config/config.exs",
      (...)
    ]
  end

  (...)

end

这在Mix & OTP 入门指南的章节中有所解释。


您可以使用相同的技巧,通过将以下行添加到 hello_app/config/config.exs 中来显式导入依赖项的配置:

import_config "../../world_app/config/config.exs"

1
这对我非常有帮助,谢谢。 知识越多,收获越多 - Question Mcquestioner

0
作为对Zoltán答案的更新,如果您在文档中使用Config而不是Mix.Config,则应该注意:

确保您的import_config/1调用没有通配符。 如果有,您需要手动执行通配符查找。例如, 如果您这样做:

import_config "../apps/*/config/config.exs"

它必须被替换为:
for config <- "../apps/*/config/config.exs" |> Path.expand(__DIR__) |> Path.wildcard() do
      import_config config
    end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接