如何通过Mix/Config控制Elixir Demo模块仅在指定环境编译?
当然可以!Mix/Config 完全能帮你做到这点
Elixir 的构建工具 Mix 提供了几种非常直观的方式,让你轻松控制模块只在特定环境下编译,完美适配你的需求——让 Demo 功能仅在开发和集成测试环境生效,彻底从生产环境中移除。
下面分享两种最常用的方案,你可以根据自己的场景选择:
方案一:按环境划分源码目录(适合多模块场景)
如果你的 Demo 相关功能不止一个模块,推荐用这种方式,结构更清晰:
- 先把所有仅用于 dev/test 的模块放到单独的目录,比如
lib/dev_only/(或者lib/test_support/,根据用途命名)。 - 修改
mix.exs中的编译路径配置,让生产环境只编译核心的lib/目录,其他环境额外包含这个专属目录:
def project do [ app: :my_app, version: "0.1.0", elixir: "~> 1.14", # 关键配置:根据环境动态设置编译路径 compile_paths: compile_paths(Mix.env()), # 其他常规配置... ] end # 生产环境只编译核心lib目录 defp compile_paths(:prod), do: ["lib"] # 开发/测试环境同时编译核心目录和dev专属目录 defp compile_paths(_env), do: ["lib", "lib/dev_only"]
这样一来,prod 环境编译时会直接忽略 lib/dev_only/ 下的所有代码,完全不会把它们打包到发布包中。
方案二:模块内加条件编译指令(适合单模块场景)
如果只有一个 Demo 模块,直接在模块代码里加环境判断更简单:
# 只有在dev或test环境下,才会定义这个模块 if Mix.env() in [:dev, :test] do defmodule MyApp.Demo do def hello do IO.puts("这是仅在开发/测试环境可用的Demo功能!") end end end
当在生产环境编译时,这段代码会被直接跳过,MyApp.Demo 这个模块根本不会存在。如果有人不小心在 prod 代码里调用它,编译阶段就会报错,提前帮你规避风险。
额外注意事项
- 如果有其他模块需要调用这个 Demo 模块,记得也要给调用代码加上环境判断,避免 prod 环境出现编译错误:
if Mix.env() in [:dev, :test] do MyApp.Demo.hello() end
- 如果你用的是 Elixir 1.10+,也可以结合
Mix.env?/1函数,写法更直观:if Mix.env?(:dev) or Mix.env?(:test) do ... end
内容的提问来源于stack exchange,提问作者janders
相关产品推荐
相关产品推荐

