Windows本地Elixir运行时如何正确获取环境变量?
Windows下Elixir项目正确获取环境变量的解决方案
问题根源
env.bat里的set命令仅在执行该bat的当前CMD会话生效,若未提前执行bat就启动项目,变量无法被读取。config.exs是编译阶段读取配置,一旦项目编译完成,后续修改环境变量不会更新已固化的配置。
方案1:手动加载环境变量后启动项目
- 打开CMD窗口,先执行环境变量脚本:
call env.bat(必须用call,否则执行完bat会直接退出会话) - 保持当前CMD窗口不变,运行
mix phx.server,此时环境变量会被会话继承,System.get_env就能正常读取。
方案2:用runtime.exs处理运行时配置(本地开发也适用)
别被“生产环境专属”的误解限制,runtime.exs本来就是用于实时读取运行时配置的,本地开发完全可以用:
- 在
config/runtime.exs中添加配置:
import Config # 读取环境变量,默认值设为"false"避免nil config :app, :enable, System.get_env("ENABLE_XXX") || "false"
- 注释或删除
config.exs中对应的enable配置项,避免冲突。 - 直接启动项目,配置会在启动时实时读取环境变量,无需重新编译。
方案3:用dotenv库自动加载本地环境变量
如果不想每次手动执行bat,用dotenv_elixir库更省心:
- 在
mix.exs的依赖中添加:
defp deps do [ {:dotenv_elixir, "~> 3.0", only: [:dev, :test]} ] end
- 运行
mix deps.get安装依赖。 - 在项目根目录创建
.env文件,写入:
ENABLE_XXX=true
- 直接执行
mix phx.server,库会自动加载.env里的变量到当前会话。
验证步骤
- 先在CMD中执行
echo %ENABLE_XXX%,确认变量已成功设置。 - 也可以在Elixir代码中临时添加
IO.inspect(System.get_env("ENABLE_XXX")),排查是变量未加载还是配置读取的问题。
内容的提问来源于stack exchange,提问作者indhu
相关产品推荐
相关产品推荐

