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

Posted

技术标签:

【中文标题】如何取消引用 Gradle 出版物的集合?【英文标题】:How do I de-reference a collection of Gradle publications? 【发布时间】:2018-07-26 12:26:30 【问题描述】:

已解决 - 请参阅本文结尾。

当单独发布 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]"
            
        
    

【问题讨论】:

我将编辑帖子以使其更清晰,但主要问题是使用的上传 URL 与 RPM 工件文件名不匹配。 您可以尝试使用layout 'pattern', artifact '[originalname]' ' 吗?它应该应用一个通用模式来使用文件名。 抱歉 - 我不太清楚你的意思... [originalname] 似乎不是一个有效的选项。 根据this documentation 上的常春藤模式(链接在IvyArtifactRepository 的 Gradle 文档底部),它是一个有效的占位符(从 1.4 版开始)。这就是我想试一试的原因。 是的,我也看到了......但不幸的是,我得到这样的输出:Upload https://artifactrepository/artifactory/yum/foo/%5Boriginalname%5D 【参考方案1】:

由于尚未实现 [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 出版物的集合?的主要内容,如果未能解决你的问题,请参考以下文章

org.hibernate.QueryException:非法尝试取消引用集合

取消引用集合迭代器时将“字符串&”绑定到“常量字符串”时出错

获取后如何取消设置(删除)集合元素?

如何在 mongoDB 中取消嵌套和分组集合

如何在查询中取消嵌套嵌套表的集合?

实战挖掘某出版社漏洞集合