配置Expo项目报错:无法获取SoftwareComponent容器的'release'属性
./gradlew clean时的release属性错误 问题现象
执行./gradlew clean时触发错误:
配置项目':expo'时发生问题,无法获取org.gradle.api.internal.component.DefaultSoftwareComponentContainer类型SoftwareComponent容器的未知属性'release'。
环境信息:
- React Native Expo项目
- 尝试过Java 11/17/20/22版本
- Gradle版本8.3
用户项目中build.gradle的签名与构建类型配置如下:
signingConfigs { release { if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) { storeFile file(MYAPP_UPLOAD_STORE_FILE) storePassword MYAPP_UPLOAD_STORE_PASSWORD keyAlias MYAPP_UPLOAD_KEY_ALIAS keyPassword MYAPP_UPLOAD_KEY_PASSWORD } } debug { storeFile file('debug.keystore') storePassword 'android' keyAlias 'androiddebugkey' keyPassword 'android' } } buildTypes { debug { signingConfig signingConfigs.debug } release { // Caution! In production, you need to generate your own keystore file. signingConfig signingConfigs.release shrinkResources (findProperty('android.enableShrinkResourcesInReleaseBuilds')?.toBoolean() ?: false) minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } }
问题原因
该错误并非来自用户提供的配置代码,而是expo模块自身的build.gradle中存在过时的Gradle API调用:Gradle 7.x及以上版本对SoftwareComponentContainer的访问方式做了变更,旧代码中直接通过components.release访问组件的写法已被废弃,导致无法识别release属性。
解决方案
修复expo模块的Gradle配置
找到项目中node_modules/expo/android/build.gradle文件,搜索是否存在类似components.release的代码,将其替换为components.findByName("release")。升级expo依赖版本
若不想手动修改依赖包代码,直接将项目中的expo依赖升级到最新稳定版,新版本通常已适配Gradle 8.x的API规范。刷新依赖缓存
修改配置或升级依赖后,执行./gradlew clean --refresh-dependencies命令刷新Gradle依赖缓存,再重新执行清理或构建操作。检查全局Gradle配置
确认项目根目录的gradle.properties文件中没有强制启用旧Gradle组件模型的配置,确保org.gradle.java.home指向正确的Java版本,无冲突配置项。
内容的提问来源于stack exchange,提问作者Harikrishnan

