EAS Build托管工作流下Expo应用添加Gradle仓库解决依赖缺失问题
解决方案
报错核心原因是替换为自定义fork的相机包后,EAS构建安卓项目时,没有将该npm包内携带cameraview aar的本地maven目录加入Gradle仓库寻址列表,导致依赖拉取失败。以下是无需脱离Expo托管工作流的可行方案,按实现成本从低到高排序:
方案1:通过官方expo-build-properties添加maven仓库(最简单,零自定义插件代码)
Expo官方提供的expo-build-properties配置插件原生支持添加自定义Gradle仓库,不需要自行编写插件逻辑:
- 安装依赖:执行
npx expo install expo-build-properties - 打开项目根目录的
app.json/app.config.js,在plugins数组中添加如下配置:
{ "expo": { "plugins": [ [ "expo-build-properties", { "android": { "extraMavenRepos": ["../node_modules/myApp-expo-camera/android/maven"] } } ] ] } }
- 提交代码重新触发EAS构建即可,构建过程中会自动把该仓库路径加入安卓项目的Gradle仓库配置,正常拉取cameraview依赖。
方案2:自定义Config Plugin注入Gradle配置(适配旧版Expo SDK)
如果项目使用的Expo SDK版本较低,expo-build-properties不支持extraMavenRepos参数,可以自行编写轻量配置插件实现同样效果:
- 在项目根目录创建
plugins/with-custom-camera-maven.js文件,写入以下代码:
const { withProjectBuildGradle } = require('@expo/config-plugins'); module.exports = function withCustomCameraMaven(config) { return withProjectBuildGradle(config, (config) => { const mavenConfig = ` maven { url "$rootDir/../node_modules/myApp-expo-camera/android/maven" } `; // 避免重复注入配置 if (config.modResults.contents.includes('myApp-expo-camera/android/maven')) { return config; } // 将maven配置插入到allprojects的repositories块中 config.modResults.contents = config.modResults.contents.replace( /allprojects\s*\{[\s\S]*?repositories\s*\{/, match => match + mavenConfig ); return config; }); };
- 在
app.json的plugins数组中引入该自定义插件:
{ "expo": { "plugins": ["./plugins/with-custom-camera-maven.js"] } }
- 重新触发EAS构建即可生效。
方案3:在fork的包内内置expo插件配置(多项目复用最优)
如果后续需要在多个项目中复用这个fork的myApp-expo-camera包,可以直接在fork包内添加expo插件配置,实现依赖安装后自动注入maven仓库,不需要每个使用的项目单独修改配置:
- 在fork的
myApp-expo-camera包根目录创建plugin.js文件,逻辑和方案2中的插件一致,仅需根据npm包的依赖层级调整maven路径为相对路径即可 - 在fork包的
package.json中添加插件声明:
{ "expo": { "plugin": "./plugin.js" } }
- 重新发布npm包后,只要项目安装了
myApp-expo-camera,EAS构建时就会自动执行包内插件注入对应配置,无需额外修改项目设置。
注意:以上所有方案都不需要将项目从Expo托管工作流切换到裸工作流,所有原生配置修改都在EAS构建的prebuild阶段自动完成,不会在项目目录下生成常驻的android/ios原生文件夹。
内容的提问来源于stack exchange,提问作者Custo
相关产品推荐
相关产品推荐

