2015-11-22 2 views
0

Я пытаюсь опубликовать снимок плагина grails 3 в удаленном хранилище maven (Artifactory). Вот мой сценарий сборки:опубликовать плагин grails3 для artifactory - различия в порожденных poms

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 - установить плагин в местном все м2 репо работает отлично, и П выглядит хорошо, она имеет зависимости с точно такими же областями и версиями, также предоставленные зависимостями исключаются из 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> 

Также П после 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 в разделе публикаций. Любая помощь высоко ценится.

ответ

2

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