使用Distillery与Edeliver构建Elixir umbrella项目发布时遇任务缺失错误
release任务的问题 嘿,我遇到过几乎一模一样的问题!本地直接跑mix release --verbose --env="production" --name="se_example"完全正常,但用Edeliver构建就报错找不到release任务,折腾了好一阵才搞定,给你分享几个关键排查点:
1. 先确认Distillery的依赖配置没踩坑
打开你的mix.exs,检查deps函数里的Distillery配置——一定要确保它没有被限制在非生产环境!比如如果之前写的是only: :dev,那prod构建时根本不会安装它,自然找不到任务。正确的配置应该是这样:
defp deps do [ {:distillery, "~> 2.1", runtime: false}, # 其他依赖... ] end
runtime: false是没问题的,它只是说运行时不需要加载,但构建时还是会安装的。
2. 给Edeliver加个配置文件强制加载依赖
Edeliver默认的构建流程有时候会跳过一些依赖安装步骤,尤其是runtime: false的依赖。你可以在项目根目录创建(或修改).deliver/config文件,添加这些配置:
# 固定构建环境为production export MIX_ENV=production # 确保拉取prod环境的所有依赖(包括runtime: false的) export MIX_DEPS_GET_OPTIONS="--only $MIX_ENV" # 构建前先手动安装并编译依赖,避免缓存导致的问题 pre_asset_compile() { mix deps.get --only $MIX_ENV mix deps.compile }
这个脚本会在Edeliver的资产编译步骤前,强制拉取并编译所有prod依赖,确保Distillery的mix任务能被加载到。
3. 清理构建缓存再试
Edeliver的构建缓存有时候会搞事情,比如之前的依赖缓存里没有Distillery,导致一直报错。你可以用--clean参数强制清理缓存后重新构建:
mix edeliver build release production --clean --verbose
4. 针对Umbrella项目的额外检查
因为你是3个子应用的Umbrella项目,还要注意两个点:
- 根目录的
rel/config.exs(Distillery的配置文件)要正确包含所有子应用,确保发布时能打包所有代码; - 在
.deliver/config里添加Umbrella的构建参数:
这个参数会告诉Edeliver按照Umbrella项目的方式构建,避免只构建根应用的问题。export EDELIVER_MIX_BUILD_OPTIONS="--umbrella"
5. 版本兼容性排查
如果上面的步骤都没用,可能是Edeliver和Distillery的版本不兼容。比如旧版Edeliver对Distillery 2.x的支持不太好,你可以尝试把两者都更新到最新稳定版:
- 更新Distillery:修改
mix.exs里的版本号,然后跑mix deps.update distillery; - 更新Edeliver:如果是通过git安装的,重新拉取最新代码,或者用官方的安装脚本重新安装一遍。
按照这些步骤逐一排查,应该能解决找不到release任务的问题。我当时就是因为Distillery的依赖被不小心限制在了dev环境,改完就好了😂
内容的提问来源于stack exchange,提问作者Meraj Rasool




