You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Mix/Config控制Elixir Demo模块仅在指定环境编译?

当然可以!Mix/Config 完全能帮你做到这点

Elixir 的构建工具 Mix 提供了几种非常直观的方式,让你轻松控制模块只在特定环境下编译,完美适配你的需求——让 Demo 功能仅在开发和集成测试环境生效,彻底从生产环境中移除。

下面分享两种最常用的方案,你可以根据自己的场景选择:

方案一:按环境划分源码目录(适合多模块场景)

如果你的 Demo 相关功能不止一个模块,推荐用这种方式,结构更清晰:

  1. 先把所有仅用于 dev/test 的模块放到单独的目录,比如 lib/dev_only/(或者 lib/test_support/,根据用途命名)。
  2. 修改 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:08:19