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

distillery打包Elixir应用是否需将mix加入extra_applications?

将Mix打入Distillery发布包的弊端

将mix应用加入extra_applications随Distillery打包进生产发布包,主要有以下几类弊端:

  • 无端增大发布包体积
    Mix是构建期工具,自带大量仅编译、调试阶段需要的任务逻辑、依赖组件和模板文件,完全不需要带入运行环境,会让最终发布包体积增加数MB,拖慢部署包拉取、分发的效率。
  • 提升生产环境安全风险
    Mix内置了大量可执行任意代码、修改文件系统、拉取外部依赖的内置任务,一旦生产环境被攻击者获取权限,额外存在的Mix相当于给攻击者提供了现成的高危工具链,大幅扩大攻击面。
  • 核心判断逻辑本身不可靠
    你期望通过Mix.env()实现运行时环境判断的逻辑本身是错误的:Mix.env()返回的永远是构建发布包时指定的MIX_ENV值,和运行时的部署环境没有任何关系。比如你用MIX_ENV=prod构建的包,不管你把它部署到测试还是灰度环境,运行时调用Mix.env()永远返回:prod,完全达不到你想要的运行时判断效果。
  • 违反OTP发布设计规范,易引发兼容问题
    Distillery生成的是标准OTP生产发布包,设计原则就是完全脱离构建工具独立运行,强行把构建期的Mix带入运行时会打破构建、运行的边界,后续升级Elixir、Distillery版本时极容易出现难以排查的兼容异常。

替代实现方案

你可以通过应用配置实现完全等价的运行时环境判断,不需要依赖Mix:

  1. 在各环境配置文件中写入环境标识,比如config/prod.exs中添加:
config :evercam_media, env: :prod

同理在config/dev.exs、config/test.exs中分别配置对应值
2. 运行时代码直接读取配置判断即可:

if Application.get_env(:evercam_media, :env) == :prod do
  # 仅生产环境执行对应逻辑
end

内容的提问来源于stack exchange,提问作者Salah Eddine Taouririt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:45:04