如何在自定义PublishToIvyRepository任务中重用IvyPublication?

时间:2018-01-23 20:14:40

标签: gradle ivy

我有一个build.gradle文件,其中包含我正在发布的工件,符合Ivy publishing documentation中提供的指南。

publishing {
    publications {
        ivy(IvyPublication) {
            from components.java
            descriptor.withXml {
                asNode().info[0].appendNode("description", description)
            }
        }
    }
}

我有一个单独的PublishToIvyRepository任务,我想配置它以便它进入另一个正常的存储库,但使用与上面代码相​​同的发布。我最初的尝试是这样的:

task publishToIvyLocal(type: PublishToIvyRepository) {
    repository = mySpecialRepository
    publication = project.publishing.publications[0]
}

但是,这似乎不起作用。如果我把它放在上面的publishing {}块之前,我会收到以下错误:

  

无法配置'发布'访问后的扩展名。

我猜测project.publishing.publications[0]不是重复使用此出版物的最佳方式。

如何在自定义PublishToIvyRepository任务中重用IvyPublication?

2 个答案:

答案 0 :(得分:2)

无需自行创建PublishToIvyRepository任务。

  

应用'ivy-publish'插件执行以下操作:

     
      
  • [...]
  •   
  • 建立规则,为添加的每个PublishToIvyRepository的组合自动创建IvyPublication任务(请参阅第35.2节“出版物”),并添加每个IvyArtifactRepository(参见第35.3节, “存储库”)。
  •   

因此,只需将您的出版物与两个存储库一起添加,就会创建两个任务,一个用于发布每个存储库的出版物。

  

创建的任务名为publish«PUBNAME»PublicationTo«REPONAME»Repository,此示例为publishIvyJavaPublicationToIvyRepository

一些示例代码:

publishing {
    publications {
        mySpecial(IvyPublication) {
            // configure publication
        }
    }
    repositories {
        ivy {
            name = 'first'
            // configure first repository
        }
        ivy {
            name = 'second'
            // configure second repository
        }
    }
}

这应该创建以下任务:

  • publishMySpecialPublicationToFirstRepository
  • publishMySpecialPublicationToSecondRepository

关于存储库名称:

  

此存储库的名称。名称在存储库集中必须是唯一的。如果未提供,则为存储库提供默认名称。

答案 1 :(得分:1)

鉴于您的代码示例,我同意lu.koerfer的回答,但如果您确实需要自定义发布任务,则可以使用project.afterEvaluate在配置后访问publishing容器:

project.afterEvaluate
{
    customPublicationTask.publication = project.publishing.publications["ivy"]
    // a publication can be accessed by its name
}