gpt4 book ai didi

gradle - Gradle:如何使规则创建的ZipTask成为Maven发布工件

转载 作者:行者123 更新时间:2023-12-03 04:29:13 26 4
gpt4 key购买 nike

我想从RuleSource内部创建一个Maven发布,该发布将通过maven-publish插件发布。出版物的 Artifact 是根据规则创建的一系列Zip任务的输出。当我尝试添加 Artifact 时,出现循环规则异常。

这是我非常简单的build.gradle:

buildscript {
repositories {
mavenCentral()
}

dependencies {
}
}

task wrapper(type: Wrapper) {
gradleVersion = '3.3'
}

apply plugin: 'groovy'
apply plugin: 'testpub'

repositories {
mavenCentral()
}

dependencies {
compile 'org.codehaus.groovy:groovy-all:2.4.7'
}
testpub插件存在于 buildSrc目录中。为了能够如上所述应用它,它需要以下属性文件:
// buildSrc/src/main/resources/META_INF/gradle-plugins/testpub.properties
implementation-class=TestPubPlugin

这是非常简单的插件文件:
import org.gradle.api.Project
import org.gradle.api.Plugin
import org.gradle.model.RuleSource
import org.gradle.api.Task
import org.gradle.model.Mutate
import org.gradle.model.Finalize
import org.gradle.api.tasks.bundling.Zip
import org.gradle.model.ModelMap
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication


class TestPubPlugin implements Plugin<Project> {
void apply(Project project) {
project.configure(project) {
apply plugin: 'maven-publish'

publishing {
repositories {
maven {
url "someUrl"
}
}
}

}
}

static class TestPubPluginRules extends RuleSource {

@Mutate
public void createSomeTasks(final ModelMap<Task> tasks) {
5.times { suffix ->
tasks.create("someTask${suffix}", Zip) {
from "src"
destinationDir(new File("build"))
baseName "someZip${suffix}"
}
}
}

@Mutate
public void configurePublishingPublications(final PublishingExtension publishing, final ModelMap<Task> tasks) {

// Intention is to create a single publication whose artifacts are formed by the `someTaskx` tasks
// where x = [0..4]
publishing {
publications {
mavPub(MavenPublication) {
tasks.matching {it.name.startsWith('someTask')}.each { task ->
artifact(task)
}
}
}
}
}
}
}

该插件会创建许多名为 someTaskx的任务,其中 x=[0..4]。他们只是简单地压缩src目录。我想将输出文件作为 Artifact 添加到单个MavenPublication中。但是,我得到以下异常:
* What went wrong:
A problem occurred configuring root project 'testpub'.
> A cycle has been detected in model rule dependencies. References forming the cycle:
tasks
\- TestPubPlugin.TestPubPluginRules#createSomeTasks(ModelMap<Task>)
\- MavenPublishPlugin.Rules#realizePublishingTasks(ModelMap<Task>, PublishingExtension, File)
\- PublishingPlugin.Rules#tasksDependOnProjectPublicationRegistry(ModelMap<Task>, ProjectPublicationRegistry)
\- projectPublicationRegistry
\- PublishingPlugin.Rules#addConfiguredPublicationsToProjectPublicationRegistry(ProjectPublicationRegistry, PublishingExtension, ProjectIdentifier)
\- publishing
\- TestPubPlugin.TestPubPluginRules#configurePublishingPublications(PublishingExtension, ModelMap<Task>)
\- tasks

有什么问题,我该如何解决?

最佳答案

我不完全理解为什么这是一个“循环”,但是规则方法始终具有一个可变部分(主题)和零个或多个不变(输入)。在第二种方法中,您要传递publishing作为要更改的主题,并传递tasks作为输入。我以为可以,但是显然不是。

您可能试图切换方法参数,先传递任务,然后传递PublishingExtension,但是您可能无法更改它(因为gradle文档说它是不可变的)。

我不确定您的用例到底是什么,可能有一个更简单的解决方案不使用规则或插件。也许您可以问其他与原始要求有关的问题,而不是这个特定问题。

但是回到您的问题。解决问题的方法可能是这样的:

import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.tasks.bundling.Zip
import org.gradle.model.Defaults
import org.gradle.model.ModelMap
import org.gradle.model.Mutate
import org.gradle.model.RuleSource

class TestPubPlugin implements Plugin<Project> {
void apply(Project project) {
project.configure(project) {
apply plugin: 'maven-publish'

publishing {
publications {
maven(MavenPublication) {
groupId 'com.example'
artifactId 'artifact'
}
}
repositories {
maven {
url "someUrl"
}
}
}

}
}

static class TestPubPluginRules extends RuleSource {
static final def buffer = []

@Defaults
public void createSomeTasks(final ModelMap<Task> tasks) {
5.times { suffix ->
tasks.create("someTask${suffix}", Zip) {
from "src"
destinationDir(new File("build"))
baseName "someZip${suffix}"
}
}
tasks.each { task ->
if (task.name.startsWith('someTask'))
buffer << task
}
}

@Mutate
public void configurePublishingPublications(PublishingExtension extension) {
MavenPublication p = extension.publications[0]
buffer.each { task ->
p.artifact(task)
}
}
}
}

这里的技巧是首先运行任务的变量器(@Defaults阶段应在@Mutate之前运行)并保存任务,因此我们以后无需再询问它们。规则可以包含静态的final字段,因此我们在此处使用列表。

然后,我们运行发布增强器。您使用的代码无效。它可以在config部分工作,但不能在groovy类中工作。因此,我准备了出版物,然后从缓冲区中添加了 Artifact 。

我运行 gradlew publish并得到:
Execution failed for task ':publishMavenPublicationToMavenRepository'.
> Failed to publish publication 'maven' to repository 'maven'
> Invalid publication 'maven': artifact file does not exist: 'build\someZip0.zip'

看来它正在工作。

关于gradle - Gradle:如何使规则创建的ZipTask成为Maven发布工件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41911241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com