首页 > 解决方案 > import_config "#{Mix.env}.exs" 上的 Code.LoadError

问题描述

我把导入这个config.exs文件:

use Mix.Config
import_config "#{Mix.env}.exs"

或者

import_config "#{Mix.env()}.exs"

当我尝试运行时mix test,它会抱怨:

mix test                                    
** (Code.LoadError) could not load /Users/romenigld/workspace/elixir/ebooks/issues/config/test.exs
    (elixir) lib/code.ex:1147: Code.find_file/2
    (elixir) lib/code.ex:706: Code.eval_file/2
    (mix) lib/mix/config.ex:187: anonymous fn/2 in Mix.Config.__import__!/2
    (elixir) lib/enum.ex:1925: Enum."-reduce/3-lists^foldl/2-0-"/3
    (mix) lib/mix/config.ex:186: Mix.Config.__import__!/2
    (stdlib) erl_eval.erl:680: :erl_eval.do_apply/6
    (elixir) lib/code.ex:232: Code.eval_string/3

这是一个错误还是我需要做一些不同的事情?

标签: elixirelixir-mix

解决方案


import_config/1工作原理

Mix.Config#import_config/1

从给定文件导入配置。

[...]

如果 path_or_wildcard 不是通配符而是单个文件的路径,则导入该文件;如果文件不存在,则会引发错误。

如果path/wildcard是相对路径/wildcard,则相对于当前配置文件所在目录展开。

Mix.env/0工作原理

Mix#env/0

返回混合环境。

当您的应用程序启动时,它将从环境变量中读取值,如果未MIX_ENV设置:dev环境变量,则进行设置。比较执行

调用时运行的任务通过属性mix test 告诉 Mix默认为:test环境。@preferred_cli_env

结合import_config/1Mix.env/1

有一行代码相当于

import_config "#{Mix.env()}.exs"

将在编译时(第一次运行mix test时)评估为

import_config "test.exs"

由于路径是相对的,它将test.exs在包含调用的文件所在的同一目录中查找文件import_config

在您的情况下,您必须为您的应用程序应该运行的所有其他环境(可能和)/Users/romenigld/workspace/elixir/ebooks/issues/config/创建一个有效的配置文件。/Users/romenigld/workspace/elixir/ebooks/issues/config/test.exsdevprod

您可以通过在调用之前检查环境来绕过为所有环境创建配置文件import_config

unless Mix.env() == :prod do
  import_config("#{Mix.env()}.exs")
end

推荐阅读