Выпуск многомодульного проекта в artifactory перестал работать после обновления gradle

#android #maven #gradle #artifactory #aar

#Android #maven #gradle #artifactory #aar

Вопрос:

У меня есть библиотека с 4 модулями (все они являются aar). Перед обновлением до новейшего gradle для каждого модуля мне нужно было запустить artifactoryPublish task. Прямо сейчас мне нужно очистить и перестроить проект перед запуском каждой задачи публикации.

 > Task :module-1:generatePomFileForAarPublication
> Task :module-1:artifactoryPublish

> Task :extractModuleInfo
No publisher config found for project: android-integration-sdk-light

> Task :module-1:extractModuleInfo
> Task :module-2:extractModuleInfo
> Task :module-3:extractModuleInfo
> Task :module-4:extractModuleInfo
[pool-4-thread-1] Deploying artifact: https://xxx.yyy
[pool-4-thread-1] Deploying artifact: https://xxx.yyy
> Task :artifactoryDeploy

BUILD SUCCESSFUL in 6s
 

Запуск первой задачи

 > Task :module-1:generatePomFileForAarPublication
> Task :module-1:artifactoryPublish
> Task :extractModuleInfo UP-TO-DATE
> Task :module-1:extractModuleInfo UP-TO-DATE
> Task :module-2:extractModuleInfo UP-TO-DATE
> Task :module-3:extractModuleInfo UP-TO-DATE
> Task :module-4:extractModuleInfo UP-TO-DATE
> Task :artifactoryDeploy

BUILD SUCCESSFUL in 2s
 

Запуск второй задачи

 Config for artifactory:

apply plugin: 'com.jfrog.artifactory'
apply plugin: 'maven-publish'
apply from: "../artifactory/config.gradle"

publishing {
    publications {
        aar(MavenPublication) {
            groupId project.groupId
            version project.versionName
            artifactId project.name
            artifact("$buildDir/outputs/aar/${project.getName()}-release.${project.fileExtension}")

            pom.withXml {
                def node = asNode()
                // ugly hack to set the packaging property in the POM as 'aar'
                ((NodeList) node.get('packaging')).get(0).value = project.fileExtension
                def dependenciesNode = node.appendNode('dependencies')
                def cl = { Dependency dep ->
                    if (dep.group == null || dep.name == null || dep.name == "unspecified") {
                        return // ignore invalid dependencies
                    }
                    def dependencyVersion
                    //Only a temporary hack - need more investigation
                    def dependencyGroup
                    if (dep.group == "mobile-library") {
                        dependencyGroup = groupId
                    } else {
                        dependencyGroup = dep.group
                    }

                    //"fix" for compile projects
                    if (dep.version == "unspecified" || dep.version == null) {
                        dependencyVersion = project.versionName
                    } else {
                        dependencyVersion = dep.version
                    }

                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dependencyGroup)
                    dependencyNode.appendNode('artifactId', dep.name)
                    dependencyNode.appendNode('version', dependencyVersion)

                    if (!dep.transitive) {
                        // If this dependency is transitive, we should force exclude all its dependencies them from the POM
                        def exclusionNode = dependencyNode.appendNode('exclusions').appendNode('exclusion')
                        exclusionNode.appendNode('groupId', '*')
                        exclusionNode.appendNode('artifactId', '*')
                    } else if (!dep.properties.excludeRules.empty) {
                        // Otherwise add specified exclude rules
                        def exclusionsNode = dependencyNode.appendNode('exclusions')
                        dep.properties.excludeRules.each { ExcludeRule rule ->
                            def exclusion = exclusionsNode.appendNode('exclusion')
                            exclusion.appendNode('groupId', rule.group ?: '*')
                            exclusion.appendNode('artifactId', rule.module ?: '*')
                        }
                    }
                }

                // List all dependencies and write to POM
                configurations.api.getAllDependencies().each cl
                configurations.implementation.getAllDependencies().each cl
            }

        }
    }
}




artifactory {
    contextUrl = repositoryPath

    publish {
        repository {
            repoKey = repositoryName
            username = repositoryUserName
            password = repositoryPassword
            maven = true
        }

        defaults {
            publications('aar')
            publishArtifacts = true

            // Publish generated POM files to Artifactory (true by default)
        }
    }
}
 

Использование файла в подмодулях, каждый модуль имеет свое собственное имя:

 project.ext {
    name = "module-1"
    fileExtension = "aar"
}

apply plugin: 'com.android.library'
apply from: "../artifactory/release.gradle"
 

Должен ли я принудительно очищать задачу и перестраивать задачу перед каждой публикацией?
Или я должен попытаться иметь одну точку входа для каждого модуля в главном файле gradle?

Комментарии:

1. Какая у вас версия плагина Gradle Artifactory?

2. версия: 4.16.0

Ответ №1:

Эта проблема должна была быть решена в плагине Gradle Artifactory 4.18.0.

Вы можете найти более подробную информацию об этой проблеме здесь: https://github.com/jfrog/build-info/issues/383

Пожалуйста, обновите свой плагин Gradle Artifactory.

Комментарии:

1. Привет, спасибо за эту информацию. После обновления до 4.18.0 / 4.18.1 я не могу загрузить какую-либо библиотеку. Все задачи выполняются за 0 секунд. Так что обновление не помогло.

2. Не могли бы вы открыть вопрос с более подробной информацией? github.com/jfrog/build-info/issues/new/choose

3. Какую дополнительную информацию я должен добавить?

4. Отказ от ответственности — я разработчик экосистемы в JFrog. В выпуске GitHub, пожалуйста, предоставьте выходные данные для последней версии плагина Gradle Artifactory. Кроме того, если возможно, минимальный воспроизводимый пример не является обязательным, но это было бы здорово. Спасибо!