0

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 publishMavenJavaPublicationToMyArtifactoryRepositorypomを実行しているとき、非常に奇妙に見えます.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 after にgradle installは scope の依存関係が含まれていませんprovidedgradle publishMavenJavaPublicationToMyArtifactoryRepository含まれている後の Pom.xml

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

バージョンがないと、gradle はそれを好まない。

なぜこのように異なる結果が得られるのですか? gradle publishMavenJavaPublicationToMyArtifactoryRepositoryforと同じ pom を生成するにはどうすればよいですか gradle install。出版物セクションで pom を編集する機会が好きではありません。どんな助けでも大歓迎です。

4

1 に答える 1

2

This is a known limitation of the incubating new maven-publish plugin. The install task uses the "old"/stable Install task. If you really rely on these scopes, one workaround might be to use the gradle based "uploadArchives" task instead of relying on the bintray plugin for publishing your archives. Alternatively you can implement a fix by using the xml hooks of the new publish plugin.

于 2015-11-23T06:53:31.107 に答える