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

f1tvaqid  于 2023-04-21  发布在  其他
关注(0)|答案(5)|浏览(307)

我有一个多项目的gradle构建,我已经将maven-publish插件应用于我的主构建文件中的所有subprojects
我还在那里定义了一个默认发布,名为mavenJava
这一切都很好,现在当我运行./gradlew artifactoryPublish时,我部署了来自所有子项目的工件。
但是,我希望将我的两个子项目排除在mavenJava出版物之外。
我尝试了很多方法,比如在主构建文件的subprojects块中的ext块中定义一个boolean(skipDefaultPublish),在条件if块中包含发布定义,并在我不想发布的子项目的ext块中覆盖这个变量。这不起作用,gradle抱怨它是Cannot configure the 'publishing' extension after it has been accessed.
我试过其他方法,但似乎都不起作用。
我知道唯一可行的方法是在所有子项目中定义默认的发布块,除了我不想发布的子项目,但是我有大约20个子项目,但是只有两个不应该发布这种类型的工件,所以这看起来不是最好的方法。
那么有没有什么方法可以配置所有的子项目来发布一个工件,但是只覆盖其中两个子项目,这样它们就不会这样做了呢?

更新

想弄清楚我的项目是什么样的。
根构建.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
            }
        }
    }
}

在一个应该发布工件的子项目中,而不是默认的工件:

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

uhry853o1#

根据所使用的插件,有几种方法可以发布工件。
要从发布现代(Gradle 4.x-7.x)publish类任务中排除特定模块,请执行以下操作:

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

旧版uploadArchives

uploadArchives.enabled = false

使用com.jfrog.artifactory插件:

artifactoryPublish.skip = true

Kotlin语法(tnx**@jaguililla**):

tasks.withType<PublishToMavenRepository>().configureEach { enabled = false }
tasks.withType<PublishToMavenLocal>().configureEach { enabled = false }
kxe2p93d

kxe2p93d2#

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

6kkfgxo03#

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

project.tasks.publish.enabled = false

这仍然需要将maven-pulish插件应用到项目中,但不需要额外的配置。
我在这里找到了这个设置:https://discuss.gradle.org/t/disable-maven-publish-related-tasks-not-possible/13488

zf9nrax1

zf9nrax14#

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

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

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

build.gradle

dependencies {
   .....
}

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

pxyaymoc5#

这个问题特别是关于当一些常规配置为所有子项目引入一个发布时该怎么做,但是在一个特定的项目中,您想要删除该“默认”发布,但仍然有另一个发布。大多数答案都没有解决这个问题。
The answer by the original questioner有,但它对我不起作用。
这样做:

tasks.withType(PublishToMavenRepository) {
    onlyIf {
        publication != publishing.publications.mavenJava
    }
}

(其中mavenJava是要阻止的“默认”发布的名称)。
Gradle文档在这里建议了这种解决方案:https://docs.gradle.org/current/userguide/publishing_customization.html#sec:publishing_maven:conditional_publishing

相关问题