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

Gradle 如何在自定义PublishToIvyRepository任务中重用IvyPublication?,gradle,ivy,Gradle,Ivy,我有一个build.gradle文件,其中包含我正在发布的工件,遵循 我有一个单独的任务,我想对其进行配置,使其进入另一个正常的存储库,但使用与上述代码相同的发布。我最初的尝试是: task publishToIvyLocal(type: PublishToIvyRepository) { repository = mySpecialRepository publication = project.publishing.publications[0] } 然而,这似乎不起作用。

我有一个
build.gradle
文件,其中包含我正在发布的工件,遵循

我有一个单独的任务,我想对其进行配置,使其进入另一个正常的存储库,但使用与上述代码相同的发布。我最初的尝试是:

task publishToIvyLocal(type: PublishToIvyRepository) {
    repository = mySpecialRepository
    publication = project.publishing.publications[0]
}
然而,这似乎不起作用。如果我把它放在上面的
publishing{}
块之前,我会得到以下错误:

访问“发布”扩展后无法配置该扩展

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


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

无需自行创建
PublishToIvyRepository
任务

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

  • [……]
  • 为添加的每个
    IvyPublication
    (参见第35.2节“出版物”)和添加的每个
    IvyArtifactRepository
    (参见第35.3节“存储库”)的组合建立一个规则,以自动创建一个
    PublishToIvyRepository
    任务
因此,只需使用两个存储库添加出版物,就会创建两个任务,其中一个任务用于为每个存储库发布出版物

创建的任务名为
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
关于存储库名称:

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


无需自行创建
PublishToIvyRepository
任务

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

  • [……]
  • 为添加的每个
    IvyPublication
    (参见第35.2节“出版物”)和添加的每个
    IvyArtifactRepository
    (参见第35.3节“存储库”)的组合建立一个规则,以自动创建一个
    PublishToIvyRepository
    任务
因此,只需使用两个存储库添加出版物,就会创建两个任务,其中一个任务用于为每个存储库发布出版物

创建的任务名为
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
关于存储库名称:

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


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

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

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

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

我甚至不知道这是可能的。我希望官方文档能更好地解释它。您是否需要做一些特殊的事情来生成
publishMySpecialPublicationToFirstRepository
任务?它没有显示在
gradlew tasks
中,但在我使用Gradle时会显示。您是否在项目存储库处理程序(
repositories{…}
)或发布存储库处理程序(
publishing.repositories{…}
)中指定了存储库?啊,这就是问题所在。我把它放在
存储库{…}
中。现在它显示正确了。我甚至不知道这是可能的。我希望官方文档能更好地解释它。您是否需要做一些特殊的事情来生成
publishMySpecialPublicationToFirstRepository
任务?它没有显示在
gradlew tasks
中,但在我使用Gradle时会显示。您是否在项目存储库处理程序(
repositories{…}
)或发布存储库处理程序(
publishing.repositories{…}
)中指定了存储库?啊,这就是问题所在。我把它放在
存储库{…}
中。现在它正确地显示出来了。