2016-03-07 15 views
8

Ho un progetto che ha un modulo SharedCode (Java) e in secondo luogo un modulo Android (libreria Android) che dipende dal modulo SharedCode. Voglio pubblicare un artefatto jar dal modulo SharedCode e un artefatto aar dal modulo Android. Non riesco a capire come comporre i miei file build.gradle in modo che entrambi i moduli vengano pubblicati su Artifactory quando viene eseguita l'attività artifactoryPublish. Al momento solo il modulo SharedCode pubblica il suo artefatto su Artifactory.Plugin Artifactory Gradle - Come pubblicare artefatti da più moduli in un progetto?

I miei file build.gradle sono i seguenti. Si noti che l'aspetto maven-publish dei miei file build.gradle sembra essere corretto perché quando eseguo l'attività publishToMavenLocal vedo le risorse da entrambi i moduli nella mia cartella Maven locale (ad esempio '~/.m2/repository').

In primo luogo, il file build.gradle nel mio modulo SharedCode è la seguente:

apply plugin: 'java' 
apply plugin: 'maven-publish' 
apply plugin: 'com.jfrog.artifactory' 

group = "${projectGroupId}" 
version = "${projectVersionName}" 

dependencies { 
    compile 'com.google.guava:guava:18.0' 
} 

publishing { 
    publications { 
     SharedCode(MavenPublication) { 
      groupId "${projectGroupId}" 
      artifactId 'SharedCode' 
      version "${projectVersionName}" 
      from components.java 
     } 
    } 
} 

artifactory { 
    contextUrl = "${artifactory_url}" 
    publish { 
     repository { 
      repoKey = 'libs-release-local' 
      username = "${artifactory_username}" 
      password = "${artifactory_password}" 
     } 
     defaults { 
      publications('SharedCode') 
      publishArtifacts = true 
      properties = ['qa.level': 'basic', 'dev.team': 'core'] 
      publishPom = true 
     } 
    } 
} 

In secondo luogo, il file build.gradle nel mio modulo Android è la seguente:

apply plugin: 'com.android.library' 
apply plugin: 'maven-publish' 
apply plugin: 'com.jfrog.artifactory' 

group = "${projectGroupId}" 
version = "${projectVersionName}" 

android { 
    // android stuff here... 
} 

dependencies { 
    compile project(':SharedCode') 
} 

publishing { 
    publications { 
     Android(MavenPublication) { 
      groupId "${projectGroupId}" 
      artifactId 'Android' 
      version "${projectVersionName}" 
      artifact "$buildDir/outputs/aar/Android-release.aar" 
     } 
    } 
} 

artifactory { 
    contextUrl = "${artifactory_url}" 
    publish { 
     repository { 
      repoKey = 'libs-release-local' 
      username = "${artifactory_username}" 
      password = "${artifactory_password}" 
     } 
     defaults { 
      publications('Android') 
      publishArtifacts = true 
      properties = ['qa.level': 'basic', 'dev.team': 'core'] 
      publishPom = true 
     } 
    } 
} 

Se eseguo il compito artifactoryPublish alla radice, al livello del progetto o al livello del modulo SharedCode, quindi visualizzo l'output nel modo seguente:

18:23:38: Executing external task 'artifactoryPublish'... 
Publication named 'SharedCode' does not exist for project ':Android' in task ':Android:artifactoryPublish'. 
:SharedCode:generatePomFileForSharedCodePublication 
:SharedCode:artifactoryPublish 
Deploying artifact: http://localhost:8081/artifactory/libs-release-local/com/mycompany/sdk/SharedCode/0.0.2/SharedCode-0.0.2.jar 
Deploying artifact: http://localhost:8081/artifactory/libs-release-local/com/mycompany/sdk/SharedCode/0.0.2/SharedCode-0.0.2.pom 
Deploying build descriptor to: http://localhost:8081/artifactory/api/build Build successfully deployed. 
Browse it in Artifactory under http://localhost:8081/artifactory/webapp/builds/client-sdk/1457375019604 

BUILD SUCCESSFUL 

Si noti che solo la risorsa SharedCode è pubblicata in questo caso.

Se eseguo il compito artifactoryPublish a livello di modulo Android, poi vedo uscita come segue:

18:25:25: Executing external task 'artifactoryPublish'... 
Publication named 'SharedCode' does not exist for project ':Android' in task ':Android:artifactoryPublish'. 
:Android:artifactoryPublish 
Deploying build descriptor to: http://localhost:8081/artifactory/api/build 
Build successfully deployed. Browse it in Artifactory under http://localhost:8081/artifactory/webapp/builds/client-sdk/1457375127269 

BUILD SUCCESSFUL 

Si noti che senza artefatti sono pubblicati in questo caso.

+0

Qual è la struttura delle cartelle dei moduli? Hai condiviso e Android in una terza cartella principale? Puoi mostrare anche le tue impostazioni. – RaGe

+0

Sì, ho una cartella radice che ha un file 'build.gradle' a livello di progetto che non ha nulla di sostanziale in questo momento diverso dalle dichiarazioni di classpath. E sotto quella cartella ho una cartella 'Android' e una' SharedCode' che rappresentano rispettivamente una libreria Android e un modulo Java. I file 'build.gradle' per questi due moduli sono come nella mia domanda sopra. (Grazie per il tuo aiuto btw @RaGe. Apprezzo davvero.) –

+0

Il mio file 'settings.gradle' ha queste tre linee: (1)' rootProject.name = 'client-sdk''; (2) 'include ': Android''; (3) 'include ': SharedCode''. –

risposta

2

Passando per esempi multiprogetto artifivi sul proprio repository github, sembrerebbe che solo il progetto root deve avere una sezione di configurazione artifactory{...} anziché in ogni sottoprogetto come si è fatto.

Inoltre, quando si dichiara publications('SharedCode') nel progetto root, il plugin artifactory sembra cercare una pubblicazione denominata sharedCode in ogni sottoprogetto.

vorrei provare:

  • Rimuovere la sezione artifactory{...} dal build.gradle Android

  • Rinominare la pubblicazione Android per sharedCode così (o qualcosa di più generico in entrambi i progetti)

+0

Quindi ho spostato la sezione 'artifactory {...}' dai moduli 'Android' e' SharedCode' e nel file 'build.gradle' a livello di progetto come segue:' artifactory {publish {publications ('SharedCode', 'Android')}} '. Questa sembra essere la cosa giusta da fare. Ma quando eseguo il task 'artifactoryPublish' ora ottengo i seguenti due messaggi di errore: (1)' La pubblicazione denominata 'SharedCode' non esiste per il progetto ':' in task ': artifactoryPublish''. (2) 'Pubblicazione nominata' Android 'non esiste per il progetto': 'in attività': artifactoryPublish'. Oh e nessun artefatto è pubblicato su Artifactory. –

+0

Il passo successivo è capire come rendere il task 'artifactoryPublish' consapevole dei moduli' SharedCode' e 'Android'. –

+0

È necessario aggiungere qualcosa come artifactory.skip = true nel progetto root. Uno dei progetti di esempio ce l'ha. – RaGe

3

Quindi finalmente ho funzionato tutto! Un ringraziamento speciale a @RaGe per avermi aiutato lungo la strada. I punti chiave da notare sono che il blocco artifactory deve trovarsi nel file build.gradle root-root del progetto e non nel file build.gradle dei singoli moduli.Inoltre, è necessario aggiungere artifactoryPublish.skip=true al file root del progetto build.gradle. Vedere questo repo GitHub per un esempio, ma minimal-come-possibile full-on:

https://github.com/adil-hussain-84/SO-35851251-Multiproject-Artifactory-Publish

Nel caso in cui il legame mai smette di funzionare io incollare il contenuto dei file build.gradle anche qui. In primo luogo, a livello di radice build.gradle il file del progetto:

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:1.5.0' 
     classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:4.0.1' 
    } 
} 

allprojects { 
    apply plugin: 'com.jfrog.artifactory' 

    repositories { 
     jcenter() 
    } 

    group = "${projectGroupName}" 
    version = "${projectVersionName}" 
} 

artifactoryPublish.skip=true 

artifactory { 
    contextUrl = "${artifactory_url}" 
    publish { 
     repository { 
      repoKey = 'libs-release-local' 
      username = "${artifactory_username}" 
      password = "${artifactory_password}" 
     } 
     defaults { 
     publications('SomePublication') 
      publishArtifacts = true 
      properties = ['qa.level': 'basic', 'dev.team': 'core'] 
      publishPom = true 
     } 
    } 
} 

task wrapper(type: Wrapper) { 
    gradleVersion = '2.8' 
} 

In secondo luogo, il file build.gradle del modulo Android:

apply plugin: 'com.android.library' 
apply plugin: 'maven-publish' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.2" 

    defaultConfig { 
     minSdkVersion 19 
     targetSdkVersion 23 
     versionCode Integer.parseInt("${projectVersionCode}") 
     versionName "${projectVersionName}" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile project(':SharedCode') 
    compile 'com.android.support:appcompat-v7:23.2.1' 

    testCompile 'junit:junit:4.12' 
} 

publishing { 
    publications { 
     SomePublication(MavenPublication) { 
      artifact "$buildDir/outputs/aar/Android-release.aar" 

      //The publication doesn't know about our dependencies, so we have to manually add them to the pom 
      pom.withXml { 
       def dependenciesNode = asNode().appendNode('dependencies') 

       //Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each 
       configurations.compile.allDependencies.each { 
        def dependencyNode = dependenciesNode.appendNode('dependency') 
        dependencyNode.appendNode('groupId', it.group) 
        dependencyNode.appendNode('artifactId', it.name) 
        dependencyNode.appendNode('version', it.version) 
       } 
      } 
     } 
    } 
} 

terzo luogo, infine, il file build.gradle della tavoletta SharedCode (Java):

apply plugin: 'java' 
apply plugin: 'maven-publish' 

dependencies { 
    compile 'com.google.guava:guava:18.0' 
} 

publishing { 
    publications { 
     SomePublication(MavenPublication) { 
      from components.java 
     } 
    } 
} 

Questo è tutto!

+2

Sto usando la versione '4.4.14' del plugin e posso confermare che non ho più bisogno dell'hack per aggiungere il blocco' artifactory {...} 'nel file' build.gradle' del livello root del progetto. I blocchi 'publishing {...}' e 'artifactory {...}' possono essere aggiunti separatamente in ciascuno dei moduli del progetto che devono pubblicare artefatti. –

3

La versione 4.2.0 del Gradle Artifactory Plugin è stata rilasciata la scorsa settimana e ha aggiunto la distribuzione di repository Artifactory multipli. Ora puoi semplicemente definire una chiusura artifactory con un repository differente per i diversi moduli del progetto.

+0

Questo semplicemente non è vero. Non funziona – Enrico

+0

Confermiamo che questo è un problema iniziato dal 4.4.9 del Gradle Artifactory Plugin, biglietto Jira: https://www.jfrog.com/jira/browse/GAP-272. –

+0

La versione fissa del plugin è stata rilasciata e un progetto di esempio - [gradle-example-multi-repos] (https://github.com/JFrogDev/project-examples/tree/master/gradle-examples/4) è stato aggiunto. –

Problemi correlati