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:
- 在各环境配置文件中写入环境标识,比如
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
相关产品推荐
相关产品推荐

