【问题标题】:Can Gradle upload different artifacts to different Maven repos?Gradle 可以将不同的工件上传到不同的 Maven 存储库吗?
【发布时间】:2015-04-27 14:01:33
【问题描述】:

我正在使用 Gradle 2.3 和新的 maven-publish 插件。

是否可以控制插件,使其根据项目生成的工件类型选择目标存储库?

我正在使用'os-package' plugin 生成 RPM,效果很好。我们还配置了一个 Artifactory 服务器,作为 jar 存储库和 yum 存储库。

我可以手动将 jars 上传到项目 proj-dev-local 和 rpms 到 proj-yum-local,这适用于 rpms 和 jars 的所有依赖项解析。

现在,我想设置 Gradle 任务来发布这两种类型的工件,每个工件都发布到 Artifactory 中的正确存储库。

我了解 Gradle 的官方 Artifactory 插件无法处理多个发布存储库,但我认为使用 maven-publish 插件或其他一些机制应该是可能的。

如果我在一个项目中只有 jar 工件,而在一个单独的项目中只有 rpm,我可以使用以下根项目的配置轻松(嗯...)让它工作。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath (group: 'com.netflix.nebula', name: 'gradle-ospackage-plugin', version: '2.0.3')
    }
}

apply plugin: 'java'
version = '0.1.1'

subprojects {
    apply plugin: 'maven-publish'
    version = parent.version
    plugins.withType(JavaPlugin) {
        publishing {
            publications {
                mavenJava(MavenPublication) {
                    from components.java
                    repositories {
                        maven {
                            url "https://url/artifactory/proj-dev-local"
                        }
                    }
                }
            }
        }
    }
    plugins.matching {it.class.name == "com.netflix.gradle.plugins.packaging.CommonPackagingPlugin"}.all {
        ospackage {
            vendor = 'myCompany'
        }
        publishing {
            publications {
                mavenRpm(MavenPublication) {
                    artifact buildRpm //buildRpm is a task added by the os-package plugin
                    repositories {
                        maven {
                            url "https://url/artifactory/proj-yum-local"
                        }
                    }
                }
            }
        }
    }
}

然而,这不是我的软件项目的本质 - Rpm 项目几乎都是 java 项目。 在下面的测试用例中,我有两个子项目,jarproject 仅应用“java”插件,rpmproject 同时应用“java”和“os-package”。

rpmproject 中,我将 jar 发布到我的 yum 存储库中,反之亦然。

例如,是否有某种方法可以修改 publishMavenRpmPublicationToMavenRepository 任务,使其忽略某个 repo?

$ gradlew publish  
:jarproject:generatePomFileForMavenJavaPublication  
:jarproject:compileJava UP-TO-DATE
:jarproject:processResources UP-TO-DATE
:jarproject:classes UP-TO-DATE
:jarproject:jar UP-TO-DATE
:jarproject:publishMavenJavaPublicationToMavenRepository
Uploading: test/jarproject/0.1.1/jarproject-0.1.1.jar to repository remote at https://url/artifactory/proj-dev-local
Transferring 0K from remote
Uploaded 0K
:jarproject:publish
:rpmproject:generatePomFileForMavenJavaPublication
:rpmproject:compileJava UP-TO-DATE
:rpmproject:processResources UP-TO-DATE
:rpmproject:classes UP-TO-DATE
:rpmproject:jar UP-TO-DATE
:rpmproject:publishMavenJavaPublicationToMaven2Repository
Uploading: test/rpmproject/0.1.1/rpmproject-0.1.1.jar to repository remote at https://url/artifactory/proj-dev-local
Transferring 0K from remote
Uploaded 0K
:rpmproject:publishMavenJavaPublicationToMavenRepository
Uploading: test/rpmproject/0.1.1/rpmproject-0.1.1.jar to repository remote at https://url/artifactory/proj-yum-local
Transferring 0K from remote
Uploaded 0K
:rpmproject:buildRpm UP-TO-DATE
:rpmproject:generatePomFileForMavenRpmPublication
:rpmproject:publishMavenRpmPublicationToMaven2Repository
Uploading: test/rpmproject/0.1.1/rpmproject-0.1.1.rpm to repository remote at https://url/artifactory/proj-dev-local
Transferring 2K from remote
Uploaded 2K
:rpmproject:publishMavenRpmPublicationToMavenRepository
Uploading: test/rpmproject/0.1.1/rpmproject-0.1.1.rpm to repository remote at https://url/artifactory/proj-yum-local
Transferring 2K from remote
Uploaded 2K
:rpmproject:publish

BUILD SUCCESSFUL

编辑: 感谢 Mark Vieira,当我在上述 sn-p 之后的 subprojects 闭包中添加以下代码时,它能够全部工作。

//Disable rpm publishing to jar repo and vice versa
gradle.taskGraph.whenReady { 
    try {
    tasks.getByPath("${project.getPath()}:publishMavenRpmPublicationToDevRepository").enabled = false;
    } catch (UnknownTaskException e) {
    }
    try {
    tasks.getByPath("${project.getPath()}:publishMavenJavaPublicationToYumRepository").enabled = false;
    } catch (UnknownTaskException e) {
    }
}

我仍然希望看到一种更美观的方式,因此欢迎提供进一步的答案,但至少这个解决方案对我有用。

【问题讨论】:

    标签: maven gradle publishing artifactory


    【解决方案1】:

    您可以禁用该特定发布任务。

    model {
        tasks.publishMavenRpmPublicationToMavenRepository {
            enabled = false
        }
    }
    

    此外,您可以为您的存储库命名,以便任务名称更有意义。

    maven {
        name = 'yum'
    }
    

    【讨论】:

    • 不确定逻辑会是什么样子。如果我将上面的model 代码放在闭包plugins.withType(JavaPlugin) { 中,它将禁用所有包含Java 的项目的RPM 发布,不是吗?反之亦然。我不想要那个。还是我误会了?
    • 那是不必要的。 Gradle 为每个发布/存储库组合创建一个任务。这意味着如果您声明两个出版物和两个存储库(如您在此处所拥有的),您将获得四个发布任务。您可以简单地禁用您不想运行的那些。
    • 我明白了。但是在jarproject 中,我不能对publishMavenRpmPublicationToMavenRepository 应用任何配置,因为它不是一个已定义的任务。反之亦然。所以,在我的subprojects 闭包中应用上面的model 子句会导致错误A problem occurred configuring project ':jarproject'. > The following model rules are unbound: model.tasks.publishMavenRpmPublicationToMavenRepository 我可以先尝试检查任务是否存在,不确定,会试一试。
    • 我发现了一些似乎可行的方法,将其粘贴到我的问题中并接受此答案。谢谢您的帮助!如果我在model 闭包之外执行enable=false,它会起作用。
    猜你喜欢
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2017-12-26
    • 2016-05-30
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    相关资源
    最近更新 更多