Android基于Flavor的Artifact发布至Artifactory报错咨询
问题分析
你的Gradle配置存在两个核心问题:
- 语法错误:
def ArtifactId = 'demo缺少闭合单引号,会导致配置解析失败; - 发布逻辑错误:在单个
MavenPublication中遍历所有libraryVariants,将所有变体的AAR都加入发布单元,执行artifactoryPublish时会尝试上传所有变体文件,但你仅编译了extendedRelease的AAR,其他变体文件不存在,因此触发报错。
同时原配置还有两处不合理点:
repoKey使用GroupId是错误的,应该填写Artifactory中实际存在的仓库Key(比如libs-release-local);- Pom依赖收集的是全局
implementation/api依赖,而非当前变体的专属依赖,会导致依赖信息不准确。
修复方案(两种可选)
方案一:为每个Flavor的Release变体创建独立发布单元
适合需要频繁发布不同Flavor的场景,每个Flavor对应独立的发布任务:
def GroupId = 'com.example.directory' def BaseArtifactId = 'demo' def Version = '0.0.1-IB1' productFlavors { extended {} mini {} } publishing { publications { // 遍历所有Flavor,为每个Flavor的Release变体创建单独的发布配置 productFlavors.each { flavor -> def variantName = "${flavor.name}Release" "${flavor.name}ReleaseAar"(MavenPublication) { groupId GroupId version Version artifactId "${BaseArtifactId}-${flavor.name}" // 生成如demo-extended的artifactId // 绑定对应变体的AAR文件 def variant = android.libraryVariants.find { it.name == variantName } if (variant != null) { def filename = "${archivesBaseName}-${variant.baseName}.aar" artifact("$buildDir/outputs/aar/${filename}") } // 收集当前变体的专属依赖 pom.withXml { def dependenciesNode = asNode().appendNode('dependencies') def deps = variant.compileConfiguration.allDependencies + variant.runtimeConfiguration.allDependencies deps.each { dep -> if (dep.group != null && dep.name != null && dep.name != "unspecified" && dep.version != null && dep.version != "unspecified") { def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', dep.group) dependencyNode.appendNode('artifactId', dep.name) dependencyNode.appendNode('version', dep.version) dependencyNode.appendNode('scope', 'compile') } } } } } } } artifactory { contextUrl = 'http://artifactoryUrl/artifactory' publish { repository { repoKey = 'libs-release-local' // 替换为你的Artifactory仓库Key username = "${userName}" password = "${pass}" } defaults { publishArtifacts = true properties = ['qa.level': 'basic', 'dev.team': 'core'] publishPom = true } } }
使用方式
发布extendedRelease变体:
./gradlew clean :demo:assembleextendedrelease :demo:artifactoryPublish -Ppublications=extendedReleaseAar
发布miniRelease变体:
./gradlew clean :demo:assembleminirelease :demo:artifactoryPublish -Ppublications=miniReleaseAar
方案二:通过命令行参数指定要发布的变体
适合临时发布特定变体的场景,仅维护一个发布配置:
def GroupId = 'com.example.directory' def BaseArtifactId = 'demo' def Version = '0.0.1-IB1' // 从命令行参数获取目标变体,默认发布extendedRelease def targetVariantName = project.findProperty('publishVariant') ?: 'extendedRelease' productFlavors { extended {} mini {} } publishing { publications { aar(MavenPublication) { // 查找目标变体 def variant = android.libraryVariants.find { it.name == targetVariantName } if (variant == null) { throw new GradleException("变体 ${targetVariantName} 不存在!") } groupId GroupId version Version artifactId "${BaseArtifactId}-${variant.flavorName}" // 绑定变体AAR文件 def filename = "${archivesBaseName}-${variant.baseName}.aar" artifact("$buildDir/outputs/aar/${filename}") // 收集变体专属依赖 pom.withXml { def dependenciesNode = asNode().appendNode('dependencies') def deps = variant.compileConfiguration.allDependencies + variant.runtimeConfiguration.allDependencies deps.each { dep -> if (dep.group != null && dep.name != null && dep.name != "unspecified" && dep.version != null && dep.version != "unspecified") { def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', dep.group) dependencyNode.appendNode('artifactId', dep.name) dependencyNode.appendNode('version', dep.version) dependencyNode.appendNode('scope', 'compile') } } } } } } artifactory { contextUrl = 'http://artifactoryUrl/artifactory' publish { repository { repoKey = 'libs-release-local' // 替换为你的Artifactory仓库Key username = "${userName}" password = "${pass}" } defaults { publications('aar') publishArtifacts = true properties = ['qa.level': 'basic', 'dev.team': 'core'] publishPom = true } } }
使用方式
发布extendedRelease变体:
./gradlew clean :demo:assembleextendedrelease :demo:artifactoryPublish -PpublishVariant=extendedRelease
发布miniRelease变体:
./gradlew clean :demo:assembleminirelease :demo:artifactoryPublish -PpublishVariant=miniRelease
内容的提问来源于stack exchange,提问作者nilkash
相关产品推荐
相关产品推荐

