опубликовать плагин Grails3 в Artifextory - различия в сгенерированных помпонах

Я пытаюсь опубликовать снимок плагина Grails 3 в удаленном репозитории maven (Artifactory). Вот мой скрипт сборки:

import org.springframework.util.StringUtils

buildscript {
    ext {
        grailsVersion = project.grailsVersion
    }
    repositories {
        jcenter()
        mavenLocal()
        mavenCentral()
        maven { url "https://repo.grails.org/grails/core" }
        maven { url "${artifactory_contextUrl}"
            credentials {
                username "${artifactory_user}"
                password "${artifactory_password}"
            }
            name = "remote-maven-repo"
        }
    }
    dependencies {
        classpath "org.grails:grails-gradle-plugin:$grailsVersion"
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.1.2"
    }
}

plugins {
    id "io.spring.dependency-management" version "0.5.2.RELEASE"
    id "com.jfrog.bintray" version "1.2"
}

String baseVersion = "0.1.0-%customer%-SNAPSHOT"
String currentVersion = "$baseVersion".replaceAll('%customer%',property('plugin.default.customer').toUpperCase())
version currentVersion
group "org.grails.plugins"

apply plugin: 'maven'
apply plugin: 'maven-publish'
apply plugin: "com.jfrog.artifactory"
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: "spring-boot"
apply plugin: "org.grails.grails-plugin"
apply plugin: "org.grails.grails-gsp"

println "Current customer mode: [${property("plugin.default.customer")}]"

ext {
    grailsVersion = project.grailsVersion
    gradleWrapperVersion = project.gradleWrapperVersion
}

String defaultVersion = "default"


// Custom versioning scheme, take version of dependency with 'default' version from gradle.preperties
configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        if (details.requested.version == defaultVersion) {
            customer = property("plugin.default.customer")
            String version = resolveDefaultVersion(details.requested.group, details.requested.name, customer)
            details.useVersion(version)
        }
    }
}

configurations.all {
    // check for updates every build
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}



String resolveDefaultVersion(String group, String name, String customer) {
    if(group == 'com.mycompany.domain' && name == 'custom-lib'){
        String version = property("custom-lib.${customer}.version")
        println "resolved artifact [$group.$name] version [$version]"
        return version
    }
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenLocal()
    mavenCentral()
    maven { url "https://repo.grails.org/grails/core" }
    add buildscript.repositories.getByName("remote-maven-repo")
}

dependencyManagement {
    imports {
        mavenBom "org.grails:grails-bom:$grailsVersion"
    }
    applyMavenExclusions false
}


dependencies {
    provided 'org.springframework.boot:spring-boot-starter-logging'
    provided "org.springframework.boot:spring-boot-starter-actuator"
    provided "org.springframework.boot:spring-boot-autoconfigure"
    provided "org.springframework.boot:spring-boot-starter-tomcat"

    provided "org.grails:grails-web-boot"
    provided "org.grails:grails-dependencies"
    provided 'javax.servlet:javax.servlet-api:3.1.0'

    testCompile "org.grails:grails-plugin-testing"

    console "org.grails:grails-console"

    //Security
    compile "org.grails.plugins:spring-security-core:3.0.0.M1"
    compile "org.grails.plugins:spring-security-acl:3.0.0.M1"
    //Not grails3 compatible
    //compile "org.grails.plugins:spring-security-oauth2-provider:2.0-RC5"

    compile "org.grails.plugins:hibernate:4.3.10.6"
   //configurable customer-dependent dependency, take version from gradle.properties 
    compile group: "com.mycompany.domain", name:"custom-lib", version:"$defaultVersion", changing: true
}

task wrapper(type: Wrapper) {
    gradleVersion = gradleWrapperVersion
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
            // gradle can't handle custom versioning scheme and will left com.mycompany.domain.custom-lib version value as 'default' in generated pom, we will fix it here.
            pom.withXml {
                asNode().get('dependencies').get(0).get('dependency').each { dep ->
                    String pomVer = dep.get("version").text()
                    String pomArtifactId = dep.get("artifactId").text()
                    String pomGroupId = dep.get("groupId").text()
                    if(pomVer == defaultVersion){
                        String customer = property("plugin.default.customer")
                        dep.get("version").get(0).setValue(resolveDefaultVersion(pomGroupId, pomArtifactId, customer))
                    }else if (StringUtils.isEmpty(pomVer)){
                        //gradle also left dependencies with provided scope in pom without version --> remove these dependencies
                        dep.replaceNode {}
                    }
                }
            }
        }
    }
    repositories {
        maven {
            name 'myArtifactory'
            url "${artifactoryContextUrl}/${(project.version.endsWith('-SNAPSHOT') ? snapshotRepoKey : releaseRepoKey)}"
            credentials {
                username = artifactory_user
                password = artifactory_password
            }
        }
    }
}


install.repositories.mavenInstaller.pom.whenConfigured { pom ->
    pom.dependencies.findAll { it.version == defaultVersion }.each { dep ->
        dep.version = resolveDefaultVersion(dep.groupId, dep.artifactId, property("plugin.default.customer"))
    }
}

Когда я запускаю gradle install для установки плагина в локальном репозитории m2, все работает нормально, и pom выглядит хорошо, у него есть зависимости с точно такими же областями и версиями, а также при условии, что зависимости исключаются из pom во время публикации в локальном репозитории. Когда я запускаю gradle publishMavenJavaPublicationToMyArtifactoryRepository, pom выглядит довольно странно, gradle игнорирует определенные области зависимостей сценария сборки и всегда использует runtime. Например:

пом после gradle install:

<dependency>
      <groupId>org.grails.plugins</groupId>
      <artifactId>spring-security-acl</artifactId>
      <version>3.0.0.M1</version>
      <scope>compile</scope>
</dependency>

пом после gradle publishMavenJavaPublicationToMyArtifactoryRepository:

<dependency>
      <groupId>org.grails.plugins</groupId>
      <artifactId>spring-security-acl</artifactId>
      <version>3.0.0.M1</version>
      <scope>runtime</scope>
</dependency>

Также pom после gradle install не содержит зависимостей с областью действия provided. Pom.xml после gradle publishMavenJavaPublicationToMyArtifactoryRepository содержит

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <scope>provided</scope>
</dependency>

без версии gradle это не нравится.

Почему я получаю такие разные результаты? Как я могу сгенерировать тот же pom для gradle publishMavenJavaPublicationToMyArtifactoryRepository, что и для gradle install. Мне не нравится возможность редактировать pom в разделе публикаций. Любая помощь высоко ценится.


person airfox    schedule 22.11.2015    source источник


Ответы (1)


Это известное ограничение инкубируемого нового плагина maven-publish. Задача установки использует «старую»/стабильную задачу установки. Если вы действительно полагаетесь на эти области, одним из обходных путей может быть использование задачи «uploadArchives» на основе gradle вместо того, чтобы полагаться на плагин bintray для публикации ваших архивов. В качестве альтернативы вы можете реализовать исправление, используя хуки xml нового плагина публикации.

person Rene Groeschke    schedule 23.11.2015