gradle - 如何取消引用 Gradle 出版物的集合?

标签 gradle groovy artifactory ivy

已解决 - 见本文结尾。

当单独发布 Ivy 出版物时,我如何在我的子项目部分引用该集合?

我正在处理在嵌套迭代中构建 rpm 的任务——它们看起来有点像这样:

def addWebServerTasks(aProject, hostId) {
    aProject.with {
        task "buildRpm_${hostId}"(type: Rpm, dependsOn: "templates_${hostId}") {
        ...
        }
        publishing.publications.create("${project.name}-${hostId}", IvyPublication) {
            artifact tasks."buildRpm_${hostId}".outputs.getFiles().getSingleFile()
        }
    }
}

这将创建 8 个 RPMS,其文件名格式为:subproject-env-region-hostname-version_branchname.rpm。这是一个示例:
web-server-config-DEV-EMEA-dev.server.com-1.1.0_feature_yum_upload_SNAPSHOT.noarch.rpm
web-server-config-UAT-EMEA-uat.server.com-1.1.0_feature_yum_upload_SNAPSHOT.noarch.rpm
web-server-config-UAT-APAC-uat.server.com-1.1.0_feature_yum_upload_SNAPSHOT.noarch.rpm
web-server-config-PROD-APAC-prod1.server.com-1.1.0_feature_yum_upload_SNAPSHOT.noarch.rpm
web-server-config-PROD-APAC-prod2.server.com-1.1.0_feature_yum_upload_SNAPSHOT.noarch.rpm

我已声明要发布到的存储库,如下所示,但它尝试上传到的 URL 与 RPM 名称不匹配。
subprojects {
    publishing {
        repositories {
            ivy {
                credentials {
                    username yumDeployUser
                    password yumDeployPassword
                }
                url yumRepo
            }
        }
    }
}

对于每个 RPM,我可以看到如下输出,其中 RPM 文件名与在文件系统上创建的文件名不同 - 事实上,对于上述所有 RPM,它都会尝试上传到相同的路径。
:web-server-config:generateDescriptorFileForWeb-server-config-DEV-EMEA-dev.server.comPublication
:web-server-config:publishWeb-server-config-DEV-EMEA-dev.server.comPublicationToIvyRepository
Upload https://artifactrepository/artifactory/yum/foo/myproject/web-server-config/1.1.0-feature_yum-upload-SNAPSHOT/web-server-config-1.1.0-feature_yum-upload-SNAPSHOT.rpm

缺少的是文件名的“env-region-hostname”部分。为什么要放弃这个?

注意:我正在尝试遵循(接受的答案)Upload an RPM to Artifactory from Gradle 的发布解决方案

解决方案:
根据 Gradle 文档,应该有一个可用的 [originalname] 内置模式,但似乎没有实现。作为一种解决方法,覆盖然后使用 [module] 模式,如下所示:
def rpmFile = tasks."buildRpm_${hostId}".outputs.getFiles().getSingleFile()
publishing.publications.create("${project.name}-${hostId}", IvyPublication) {
    artifact rpmFile
    module rpmFile.getName()
}

然后您的发布部分应如下所示:
publishing {
    repositories {
        ivy {
            credentials {
                username "${citiEarUser}"
                password "${citiEarPassword}"
            }
            url "${yumRepo}"
            layout 'pattern', {
                artifact "[module]"
            }
        }
    }
}

最佳答案

因为,[originalname]占位符尚未实现,您可以使用另一个占位符为您的自定义模式提供文件名:

publishing {
    publications {
        myPub(IvyPublication) {
            artifact myFile
            module myFile.name
            organisation 'myOrg' // required for some unknown reason
        }
    }
    repositories {
        ivy {
            url myUrl
            layout 'pattern', {
                artifact '[module]'
            }
        }
    }
}

关于gradle - 如何取消引用 Gradle 出版物的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48812467/

相关文章:

java - 如何使Azure Pipelines通过Gradle识别JavaFX依赖关系

android - 如何通过在 Android-Studio 中编辑 build.gradle 将我的库放在 android.jar 前面

unit-testing - Grails设置了系统属性进行测试

maven - Artifactory 是否支持 SNAPSHOT Artifact 过期的概念?

jenkins - 使用Artifactory Gradle插件在Jenkins Pipeline中设置项目版本

android - 如何强制 Jacoco 在 Gradle 中使用特定版本

android - Gradle 错误 : More than one variant of project :myModule matches the consumer attributes after upgrading to new Google Services

java - 想法 "Groovyc: unable to resolve class"- 在命令行上工作

groovy - 如何为 Spock 中的所有可继承类只执行一次 setupSpec()

nginx - docker login 为 Artifactory 返回 404