从gradle中的发布中排除一个或两个子项目

时间:2019-04-08 17:47:52

标签: gradle maven-publish

我有一个多项目gradle构建,并且已将maven-publish插件应用于我的主构建文件中的所有subprojects

我还在那里定义了一个默认出版物mavenJava

这很好,现在运行./gradlew artifactoryPublish时,我将部署所有子项目中的工件。

但是,我想从我的两个子项目中排除发布此mavenJava出版物。

我尝试了很多方法,例如在主构建文件的skipDefaultPublish块的ext块的subprojects块中定义布尔值(ext),并在其中包含发布定义有条件的if块,并在我不想发布的子项目的Cannot configure the 'publishing' extension after it has been accessed.块中覆盖此变量。那是行不通的,gradle抱怨说subprojects { apply plugin: 'maven-publish' publishing { publications { mavenJava(MavenPublication) { from components.java artifactId = getCustomProjectId() groupId = 'com.our.group.id' } } } apply plugin: "com.jfrog.artifactory" artifactory { contextUrl = ourContextUrl publish { repository { repoKey = "ourRepoKey" username = "ourArtifactoryUser" password = "ourArtifactoryPass" } defaults { publications('mavenJava') publishArtifacts = true publishPom = true } } } }

我尝试了其他方法,但似乎无济于事。

我唯一知道的将是在所有子项目中定义默认的发布块,除了那些我不想从中发布的子项目,但是我有约20个子项目,但是只有两个不应该发布这种类型的工件所以这似乎不是最好的选择。

那么,有什么办法可以配置所有子项目以发布工件,但是仅在两个子项目中覆盖它,以使他们不这样做?

更新

试图阐明我的项目的样子。

root build.gradle

project(':exsub'){
    publishing {
        publications {
            mavenSrc(MavenPublication) {
                groupId "com.our.group.id"
                artifactId "stuff-src"
                artifact srcStuff
            }
        }
    }

    artifactoryPublish {
        // publications.removeAll() //<- putting this here doesn't work
        // publications.remove('mavenJava') //<- neither does this

        publications ('mavenSrc') //<- this adds mavenSrc to the publication list but does not remove the mavenJava publication from it
    }
}

以及应该发布工件的子项目中,只是不是默认项目:

write.table

4 个答案:

答案 0 :(得分:2)

发布工件的方法有多种,具体取决于使用的插件。

使用现代 (Gradle 4.x-7.x) publish 之类的任务从发布中排除特定模块:

tasks.withType(PublishToMavenRepository).configureEach { it.enabled = false }

旧版 uploadArchives

uploadArchives.enabled = false

使用 com.jfrog.artifactory 插件:

artifactoryPublish.skip = true

答案 1 :(得分:0)

Pheww ...我想我终于想出了一种方法(解决方案的美观性值得商))。

对我来说,在子项目中放置publishing.publications.remove(publishing.publications.mavenJava)行就足够了。

但是,我必须注意将该行放在该子项目的publishing{...}块下面。

因此,现在,不应发布“默认发布”的子项目如下所示:

project(':exsub'){
    publishing {
        publications {
            mavenSrc(MavenPublication) {
                groupId "com.our.group.id"
                artifactId "stuff-src"
                artifact srcStuff
            }
        }
    }
    // Remove the default publication (note: this must be located after the publishing block above)
    publishing.publications.remove(publishing.publications.mavenJava)

    artifactoryPublish {
        publications ('mavenSrc') //<- this adds mavenSrc to the publication list but does not remove the mavenJava publication from it
    }
}

答案 2 :(得分:0)

在要排除的子项目上设置以下内容对我来说很有效:

project.tasks.publish.enabled = false

这仍然需要将maven-pulish插件应用于项目,但是不需要其他配置。

我在这里找到此设置:https://discuss.gradle.org/t/disable-maven-publish-related-tasks-not-possible/13488

答案 3 :(得分:0)

让我们考虑以下多模块项目结构。

 photos:
   -> photo-client
   -> photo-model
   -> photo-service

在上面的多模块项目中,如果我想排除photo-service子模块构建jar(任何分发文件(jar / war))的功能,而不能将其上传到配置的工件,那么我们必须使用以下代码片段在照片服务的build.gradle文件中

build.gradle

dependencies {
   .....
}

project.afterEvaluate {
    project.tasks.artifactoryPublish.enabled(false)
}