You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Distillery与Edeliver构建Elixir umbrella项目发布时遇任务缺失错误

解决Edeliver + Distillery构建时找不到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的构建参数:
    export EDELIVER_MIX_BUILD_OPTIONS="--umbrella"
    
    这个参数会告诉Edeliver按照Umbrella项目的方式构建,避免只构建根应用的问题。

5. 版本兼容性排查

如果上面的步骤都没用,可能是Edeliver和Distillery的版本不兼容。比如旧版Edeliver对Distillery 2.x的支持不太好,你可以尝试把两者都更新到最新稳定版:

  • 更新Distillery:修改mix.exs里的版本号,然后跑mix deps.update distillery
  • 更新Edeliver:如果是通过git安装的,重新拉取最新代码,或者用官方的安装脚本重新安装一遍。

按照这些步骤逐一排查,应该能解决找不到release任务的问题。我当时就是因为Distillery的依赖被不小心限制在了dev环境,改完就好了😂

内容的提问来源于stack exchange,提问作者Meraj Rasool

火山引擎 最新活动