使用 Gradle-Artifactory 插件发布子项目

Posted

技术标签:

【中文标题】使用 Gradle-Artifactory 插件发布子项目【英文标题】:Publishing subprojects with the Gradle-Artifactory plugin 【发布时间】:2014-12-28 15:24:35 【问题描述】:

我有以下多项目 Gradle 构建:

myapp/
    myapp-client/
        build.gradle
        src/** (omitted for brevity)
    myapp-shared/
        build.gradle
        src/** (omitted for brevity)
    myapp-server
        build.gradle
        src/** (omitted for brevity)
    build.gradle
    settings.gradle

myapp/build.gradle 的样子:

subprojects 
    apply plugin: 'groovy'
    sourceCompatibility = '1.7'
    targetCompatibility = '1.7'
    [compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

    repositories 
        mavenCentral()
        maven 
            // My local/private Artifactory
            url "http://localhost:8081/artifactory/myapp-snapshots"
        
    

    dependencies 
        compile (
            'org.codehaus.groovy:groovy-all:2.3.7'
        )
    

而 3 个子项目 Gradle 文件中的每一个目前都非常简单:

dependencies 
    compile (
        'org.apache.commons:commons-lang3:3.3.2'
    )

这是我想要实现的目标:

当我从父目录myapp 运行gradle clean build -Pversion=0.1.5 时,我希望所有三个子项目都使用0.1.5 版本构建;因此myapp-client-0.1.5.jarmyapp-shared-0.1.5.jarmyapp-server-0.1.5.jar。目前我的构建已经这样做了,但是...... 如果客户端和共享 JAR 构建成功,我还希望将它们发布到我的私人 Artifactory 存储库。 (我不想发布服务器 JAR)。

我能够找到并测试/确认将 Gradle 构建的 JAR 发布到 Artifactory 的最紧凑的代码是:

buildscript 
    repositories 
        maven 
            url 'http://localhost:8081/artifactory/plugins-release'
            credentials 
                username = "admin"
                password = "12345"
            
            name = "maven-main-cache"
        
    
    dependencies 
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.0.1"
    


apply plugin: 'maven-publish'
apply plugin: "com.jfrog.artifactory"

repositories 
    add buildscript.repositories.getByName("maven-main-cache")
    maven 
        url "http://localhost:8081/artifactory/myapp-snapshots"
    


artifactory 
    contextUrl = "http://localhost:8081/artifactory"
    publish 
        repository 
            repoKey = 'myapp-snapshots'
            username = "admin"
            password = "12345"
            maven = true
        
        defaults 
            publications ('mavenJava')
        
    


publishing 
    publications 
        mavenJava(MavenPublication) 
            from components.java
        
    

当我在测试 build.gradle 项目中使用这个 sn-p 并运行 gradle artifactoryPublish 时,它会正确地将我的 JAR 发布到 Artifactory。

我的问题:如何将这个 sn-p 添加到我的项目中,以便从父目录运行 gradle clean build 成功时生成客户端和共享 JAR 并发布到 Artifactory?

虽然不理想,但如果无法一口气完成所有这些,我会愿意将发布作为单独的第二步。有什么想法吗?

【问题讨论】:

【参考方案1】:

使用artifactory 插件是正确的做法。 您需要将其应用到allprojects 并使用artifactoryPublish.skip=true 禁用***项目上的部署。 您可以找到一个与您的here 非常相似的项目的完整示例。

默认build不依赖artifactoryPublish,所以你需要运行gradle build artifactoryPublish来上传jar。原因是您可能想要运行大量构建,直到您决定上传某些内容。您可以通过将build 配置为依赖于artifactoryPublish 来建立依赖关系:

build(dependsOn: 'artifactoryPublish')

【讨论】:

@Adil 我认为 JBaruch 引用了github.com/JFrogDev/project-examples/tree/master/…。这是 4.x 版本github.com/JFrogDev/project-examples/blob/master/… 任何线索为什么当单个项目中的相同代码工作时,多项目会跳过 jar 发布?无法弄清楚为什么它会跳过 我遇到的是 FIRST Artifactory 插件是在 root 上配置的,只有 THEN 是 gradle 配置的子项目,因此它们的属性像 groupversion 对 Artifactory 配置不可见.解决此问题的正确方法是什么? [JFrog 示例][1] 使用来自gradle.properties 的版本,以及从根项目设置的组名,我不想这样做。 [1]:github.com/JFrogDev/project-examples/tree/master/… 属性是要走的路。

以上是关于使用 Gradle-Artifactory 插件发布子项目的主要内容,如果未能解决你的问题,请参考以下文章

Maven学习总结(54)——使用 git-commit-id-plugin 插件来管理项目发版

ECS云服务器不支持Emlog插件Sendmail发邮件的解决办法

xposed微信插件大全

Flutter上线项目实战——环信客服插件

Flutter上线项目实战——环信客服插件

如何动态地将变量从一个函数发送到另一个函数