迁移到BOM后如何使用Maven-Publish Gradle插件生成Maven Pom

问题描述

我在build.gradle中使用以下命令通过maven-publish插件生成pom:

configurations.implementation.allDependencies.each {
    if (it.group != null && (it.name != null || "unspecified" == it.name) && it.version != null) {
        def dependencyNode = dependenciesNode.appendNode('dependency')
        dependencyNode.appendNode('groupId',it.group)
        dependencyNode.appendNode('artifactId',it.name)
        dependencyNode.appendNode('version',it.version)
    }
}

在按如下方式使用依赖项时效果很好:

implementation 'com.google.firebase:firebase-config:19.2.0'
implementation 'com.google.firebase:firebase-messaging:20.3.0'
implementation 'com.google.firebase:firebase-analytics:17.6.0'
implementation 'com.google.firebase:firebase-crashlytics:17.2.2'

但在迁移到BOM后不再可用:

implementation platform('com.google.firebase:firebase-bom:26.0.0')
implementation 'com.google.firebase:firebase-config'
implementation 'com.google.firebase:firebase-messaging'
implementation 'com.google.firebase:firebase-analytics'
implementation 'com.google.firebase:firebase-crashlytics'

在发布时不会获取版本(因此不包括依赖项):

> Task :vendor:generatePomFileForPublication
DefaultExternalModuleDependency{group='com.google.firebase',name='firebase-bom',version='26.0.0',configuration='default'}
DefaultExternalModuleDependency{group='com.google.firebase',name='firebase-config',version='null',name='firebase-messaging',name='firebase-analytics',name='firebase-crashlytics',configuration='default'}

有人知道如何使用gradle DSL从BOM表中读取版本吗? 或者如何生成pom.xml的dependencyManagement部分以反映BOM?

解决方法

决定在生成的pom.xml中的dependencyManagement下导入BOM

google(MavenPublication) {
    groupId 'group'
    artifactId 'artifact'
    version android.defaultConfig.versionName
    artifact(sourceJar)
    artifact("$buildDir/outputs/aar/my-release.aar") {
        extension 'aar'
    }
    pom.withXml {
        def dependenciesNode = asNode().appendNode('dependencies')
        def dependenciesManagementNode = asNode().appendNode('dependencyManagement').appendNode('dependencies')
        configurations.implementation.allDependencies.each {
            if (it.group != null && (it.name != null || "unspecified" == it.name)) {
                if (it.name.endsWith("-bom")) {
                    def dependencyNode = dependenciesManagementNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId',it.group)
                    dependencyNode.appendNode('artifactId',it.name)
                    dependencyNode.appendNode('version',it.version)
                    dependencyNode.appendNode('scope',"import")
                    dependencyNode.appendNode('type',"pom")
                } else {
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId',it.name)
                    if (it.version != null) {
                        dependencyNode.appendNode('version',it.version)
                    }
                }
            }
        }
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...