web-dev-qa-db-ja.com

Gradle Artifactoryプラグイン-プロジェクト内の複数のモジュールからアーティファクトを公開する方法は?

SharedCode(Java)モジュールと、次にAndroidモジュールに依存するSharedCode(Androidライブラリ)モジュールを持つプロジェクトがあります。 jarモジュールからのSharedCodeアーティファクトと、aarモジュールからのAndroidアーティファクトを公開したいと思います。 artifactoryPublishタスクの実行時に両方のモジュールがArtifactoryに公開されるように、_build.gradle_ファイルを作成する方法がわかりません。現時点では、SharedCodeモジュールのみがそのアーティファクトをArtifactoryに公開しています。

私の_build.gradle_ファイルは以下の通りです。 _maven-publish_ファイルの_build.gradle_アスペクトは正しいように見えることに注意してください。これは、publishToMavenLocalタスクを実行すると、ローカルMavenフォルダー内の両方のモジュールからのアーティファクトが表示されるためです(つまり、_'~/.m2/repository'_)。

まず、私のSharedCodeモジュールの_build.gradle_ファイルは次のとおりです。

_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
        }
    }
}
_

次に、Androidモジュールの_build.gradle_ファイルは次のとおりです。

_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
        }
    }
}
_

ルート、プロジェクトレベル、またはartifactoryPublishモジュールレベルでSharedCodeタスクを実行すると、次のような出力が表示されます。

_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
_

この場合、SharedCodeアーティファクトのみが公開されることに注意してください。

artifactoryPublishモジュールレベルでAndroidタスクを実行すると、次のような出力が表示されます。

_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
_

この場合、アーティファクトは公開されないことに注意してください。

8
Adil Hussain

Githubリポジトリのアーティファクトマルチプロジェクトの例を見ると、これまでのようにすべてのサブプロジェクトではなく、ルートプロジェクトのみに_artifactory{...}_構成セクションが必要であるように思われます。

さらに、ルートプロジェクトでpublications('SharedCode')を宣言すると、アーティファクトプラグインはすべてのサブプロジェクトでsharedCodeというパブリケーションを探しているようです。

私は試してみます:

  • Android build.gradleから_artifactory{...}_セクションを削除します

  • Androidパブリケーションの名前もsharedCode(または両方のプロジェクトでより一般的なもの)に変更します)

2
RaGe

更新:バージョン4.6.0の時点で、マルチモジュールプロジェクトでアーティファクトを公開するcom.jfrog.artifactoryGradleプラグインは機能しません。個人的な経験から、このプラグインを放棄し、標準のmaven-publishプラグインをJavaライブラリモジュールに、digital.wup.Android-maven-publishプラグインをAndroidライブラリモジュール。

だから私はついにこれをすべて機能させることができました!途中で私を助けてくれた@RaGeに特に感謝します。注意すべき重要な点は、artifactoryブロックは、個々のモジュールのbuild.gradleファイルではなく、プロジェクトのルートレベルのbuild.gradleファイルにある必要があるということです。また、プロジェクトのルートレベルのartifactoryPublish.skip=trueファイルにbuild.gradleを追加する必要があります。完全でありながら可能な限り最小限の例については、このGitHubリポジトリを参照してください。

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

リンクが機能しなくなった場合に備えて、build.gradleファイルの内容もここに貼り付けます。まず、プロジェクトのルートレベルのbuild.gradleファイル:

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'
}

次に、Androidモジュールのbuild.gradleファイル:

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)
                }
            }
        }
    }
}

最後に、SharedCode(Java)モジュールのbuild.gradleファイル:

apply plugin: 'Java'
apply plugin: 'maven-publish'

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

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

それでおしまい!

5
Adil Hussain

Gradle Artifactoryプラグインのバージョン4.2.0が先週リリースされ、複数のArtifactoryリポジトリのデプロイが追加されました。これで、プロジェクトのモジュールごとに異なるリポジトリを使用して、アーティファクトクロージャを簡単に定義できます。

3
Eyal Ben Moshe