发布插件是使其可供其他人使用的主要方式。虽然您可以发布到私有存储库以限制访问,但发布到Gradle 插件门户可以让世界上的任何人都可以使用您的插件。

插件门户页面

本指南向您展示如何使用插件通过方便的 DSLcom.gradle.plugin-publish将插件发布到Gradle 插件门户。这种方法简化了配置步骤并提供验证检查,以确保您的插件满足 Gradle 插件门户的标准。

先决条件

本教程需要一个现有的 Gradle 插件项目。如果您没有,请使用Greeting 插件示例

尝试发布此插件将安全地失败并出现权限错误,因此不必担心 Gradle 插件门户会因为一个简单的示例插件而变得混乱。

账户设置

在发布插件之前,您必须在 Gradle 插件门户上创建一个帐户。按照注册页面上的说明创建帐户并从个人资料页面的“API 密钥”选项卡获取 API 密钥。

插件门户注册页面

将 API 密钥存储在 Gradle 配置中(gradle.publish.key 和 gradle.publish.secret),或使用 Seauc Credentials 插件或 Gradle Credentials 插件等插件进行安全管理。

插件门户 API 密钥

通常的做法是将文本复制并粘贴到$HOME/.gradle/gradle.properties文件中,但您也可以将其放置在任何其他有效位置。该插件所需要的只是在执行适当的插件门户任务时,gradle.publish.key和可以作为项目属性使用。gradle.publish.secret

如果您担心放置凭据gradle.properties,请查看Seauc Credentials 插件Gradle Credentials 插件

添加插件发布插件

要发布您的插件,请将com.gradle.plugin-publish插件添加到您的项目build.gradlebuild.gradle.kts文件中:

build.gradle.kts
plugins {
    id("com.gradle.plugin-publish") version "1.2.1"
}
build.gradle
plugins {
    id 'com.gradle.plugin-publish' version '1.2.1'
}

最新版本的插件发布插件可以在Gradle 插件门户上找到。

从版本 1.0.0 开始,Plugin Publish Plugin 自动应用 Java Gradle Plugin Development Plugin(协助开发 Gradle 插件)和 Maven Publish Plugin(生成插件发布元数据)。如果使用旧版本的插件发布插件,则必须显式应用这些帮助器插件。

配置插件发布插件

com.gradle.plugin-publish在您的build.gradle或文件中配置插件build.gradle.kts

build.gradle.kts
group = "io.github.johndoe" (1)
version = "1.0" (2)

gradlePlugin { (3)
    website = "<substitute your project website>" (4)
    vcsUrl = "<uri to project source repository>" (5)

    // ... (6)
}
build.gradle
group = 'io.github.johndoe' (1)
version = '1.0'     (2)

gradlePlugin { (3)
    website = '<substitute your project website>' (4)
    vcsUrl = '<uri to project source repository>' (5)

    // ... (6)
}
1 确保您的项目有一个group集合,用于识别您在 Gradle 插件门户存储库中为插件发布的工件(jar 和元数据),并且描述插件作者或插件所属的组织。
2 设置项目的版本,该版本也将用作插件的版本。
3 使用Java Gradle 插件开发插件gradlePlugin提供的块 为您的插件发布配置更多选项。
4 为您的插件项目设置网站。
5 提供源存储库 URI,以便其他想要贡献的人可以找到它。
6 为您要发布的每个插件设置特定属性;请参阅下一节。

使用块定义所有插件的通用属性,例如组、版本、网站和源存储库gradlePlugin{}

build.gradle.kts
gradlePlugin { (1)
    // ... (2)

    plugins { (3)
        create("greetingsPlugin") { (4)
            id = "<your plugin identifier>" (5)
            displayName = "<short displayable name for plugin>" (6)
            description = "<human-readable description of what your plugin is about>" (7)
            tags = listOf("tags", "for", "your", "plugins") (8)
            implementationClass = "<your plugin class>"
        }
    }
}
build.gradle
gradlePlugin { (1)
    // ... (2)

    plugins { (3)
        greetingsPlugin { (4)
            id = '<your plugin identifier>' (5)
            displayName = '<short displayable name for plugin>' (6)
            description = '<human-readable description of what your plugin is about>' (7)
            tags.set(['tags', 'for', 'your', 'plugins']) (8)
            implementationClass = '<your plugin class>'
        }
    }
}
1 插件特定配置也进入该gradlePlugin块。
2 这是我们之前添加全局属性的地方。
3 您发布的每个插件都会有自己的内部块plugins
4 对于您发布的每个插件,插件块的名称必须是唯一的;这是仅由您的构建在本地使用的属性,不会成为发布的一部分。
5 设置插件的唯一性id,因为它将在出版物中标识。
6 以人类可读的形式设置插件名称。
7 设置要在门户上显示的说明。它为想要使用您的插件的人提供有用的信息。
8 指定您的插件涵盖的类别。它使插件更有可能被需要其功能的人发现。

例如,考虑已发布到 Gradle 插件门户的GradleTest 插件的配置。

build.gradle.kts
gradlePlugin {
    website = "https://github.com/ysb33r/gradleTest"
    vcsUrl = "https://github.com/ysb33r/gradleTest.git"
    plugins {
        create("gradletestPlugin") {
            id = "org.ysb33r.gradletest"
            displayName = "Plugin for compatibility testing of Gradle plugins"
            description = "A plugin that helps you test your plugin against a variety of Gradle versions"
            tags = listOf("testing", "integrationTesting", "compatibility")
            implementationClass = "org.ysb33r.gradle.gradletest.GradleTestPlugin"
        }
    }
}
build.gradle
gradlePlugin {
    website = 'https://github.com/ysb33r/gradleTest'
    vcsUrl = 'https://github.com/ysb33r/gradleTest.git'
    plugins {
        gradletestPlugin {
            id = 'org.ysb33r.gradletest'
            displayName = 'Plugin for compatibility testing of Gradle plugins'
            description = 'A plugin that helps you test your plugin against a variety of Gradle versions'
            tags.addAll('testing', 'integrationTesting', 'compatibility')
            implementationClass = 'org.ysb33r.gradle.gradletest.GradleTestPlugin'
        }
    }
}

如果您浏览 Gradle 插件门户上GradleTest 插件的关联页面,您将看到指定元数据的显示方式。

插件门户插件页面

来源和 Javadoc

插件发布插件会自动生成并发布Javadoc,以及插件发布的源 JAR。

标志文物

从 Plugin Publish Plugin 版本 1.0.0 开始,已发布插件工件的签名已实现自动。要启用它,所需要做的就是signing在您的构建中应用该插件。

影子依赖

从 Plugin Publish Plugin 版本 1.0.0 开始,隐藏插件的依赖项(即,将其发布为 fat jar)已自动实现。要启用它,所需要做的就是com.github.johnrengelman.shadow在您的构建中应用该插件。

发布插件

如果您在内部发布插件以供在组织内使用,则可以像任何其他代码工件一样发布它。请参阅有关发布工件的IvyMaven章节。

如果您有兴趣发布您的插件以供更广泛的 Gradle 社区使用,您可以将其发布到Gradle Plugin Portal。该站点提供搜索和收集有关 Gradle 社区贡献的插件信息的功能。请参阅有关在本网站上提供您的插件的相应部分。

本地发布

要检查已发布插件的工件外观或仅在本地或公司内部使用它,您可以将其发布到任何 Maven 存储库,包括本地文件夹。您只需要配置用于发布的存储库。然后,您可以运行publish任务将插件发布到您定义的所有存储库(但不是 Gradle 插件门户)。

build.gradle.kts
publishing {
    repositories {
        maven {
            name = "localPluginRepository"
            url = uri("../local-plugin-repository")
        }
    }
}
build.gradle
publishing {
    repositories {
        maven {
            name = 'localPluginRepository'
            url = '../local-plugin-repository'
        }
    }
}

要在另一个版本中使用该存储库,请将其添加到文件中的存储库pluginManagement {}settings.gradle(.kts)中。

发布到插件门户

使用publishPlugin任务发布插件:

$ ./gradlew publishPlugins

您可以在发布之前使用该标志验证您的插件--validate-only

$ ./gradlew publishPlugins --validate-only

如果您尚未配置gradle.propertiesGradle 插件门户,您可以在命令行上指定它们:

$ ./gradlew publishPlugins -Pgradle.publish.key=<key> -Pgradle.publish.secret=<secret>
如果您尝试使用本节中使用的 ID 发布示例 Greeting 插件,您将遇到权限失败。这是预期的,并确保门户不会被多个实验性和重复的问候类型插件淹没。

批准后,您的插件将在 Gradle 插件门户上提供,供其他人发现和使用。

使用已发布的插件

成功发布插件后,它不会立即出现在门户上。它还需要通过审批流程,对于插件的初始版本来说,这是手动的并且相对较慢,但对于后续版本来说是全自动的。有关更多详细信息,请参阅此处

一旦您的插件获得批准,您可以在https://plugins.gradle.org/plugin/<your-plugin-id>形式的 URL 中找到其使用说明。例如,Greeting 插件示例已位于门户网站https://plugins.gradle.org/plugin/org.example.greeting上。

没有 Gradle 插件门户发布的插件

如果您的插件是在没有使用Java Gradle Plugin Development Plugin 的情况下发布的,则该发布将缺少Plugin Marker Artifact ,插件 DSL需要它来定位插件。在这种情况下,解决另一个项目中的插件的推荐方法是将一个resolutionStrategy部分添加到pluginManagement {}项目设置文件的块中,如下所示。

settings.gradle.kts
resolutionStrategy {
    eachPlugin {
        if (requested.id.namespace == "org.example") {
            useModule("org.example:custom-plugin:${requested.version}")
        }
    }
}
settings.gradle
resolutionStrategy {
    eachPlugin {
        if (requested.id.namespace == 'org.example') {
            useModule("org.example:custom-plugin:${requested.version}")
        }
    }
}