11

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

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

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

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

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

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

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

4

3 に答える 3

6

更新: com.jfrog.artifactory Gradle プラグインのバージョン4.6.0では、マルチモジュール プロジェクトでアーティファクトを公開することはできません。個人的な経験から、このプラグインを放棄し、Java ライブラリ モジュールと Android ライブラリ モジュールの両方に標準のmaven-publishプラグインを使用することをお勧めします。

--- 以下は、上記の更新を投稿する前の私の最初の回答です ---

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

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

次に、モジュールのbuild.gradleファイル: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)
                }
            }
        }
    }
}

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

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

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

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

それでおしまい!

于 2016-03-16T19:34:25.757 に答える