如何使用自定义发布方案通过maven-publish发布自定义gradle插件?

时间:2019-12-16 14:22:36

标签: maven gradle gradle-plugin

我已经构建了一个自定义的gradle插件,试图将其发布到私有Maven存储库。我使用MavenPublication插件来完成此操作。遇到很多麻烦之后,我研究了Google Play服务插件(https://github.com/google/play-services-plugins/blob/master/google-services-plugin/publish.gradle)的实现,并尝试从中复制。

事实证明,只有当我添加一个名为pluginMaven的发布时,发布才能正常工作,因此我的配置必须如下所示:

task sourcesJar(type: Jar, dependsOn: classes) {
    archiveClassifier = 'sources'
    from sourceSets.main.allSource
}

publishing {
    publications {
        pluginMaven(MavenPublication) {
            groupId = 'com.magicbluepenguin'
            artifactId = 'mbpplugin'
            version = '1.0.0'
            artifact sourcesJar
        }
    }
}

将以下2个任务添加到我的项目中:

这有效,我能够将插件推送到远程仓库中,然后将其拉出并应用于示例客户端应用程序。如果我要使用一个或多个其他发布名称,则会出现问题。在这种情况下,将在我的出版物上构建的新任务与“默认”任务一起添加。因此,例如,如果我有以下发布块:

task sourcesJar(type: Jar, dependsOn: classes) {
    archiveClassifier = 'sources'
    from sourceSets.main.allSource
}

publishing {
    publications {
        pluginMavenDevelop(MavenPublication) {
            groupId = 'com.magicbluepenguin'
            artifactId = 'mbpplugin'
            version = '1.0.0'
            artifact sourcesJar
        }
    }
}

以下4个任务已添加到我的项目中:

当然还有这个问题:

  • 调用“默认”任务现在失败,因为尚未定义artifactId,版等。

  • 调用自定义任务成功,但是尝试从客户端应用程序使用插件失败,并显示Plugin with id 'mbpplugin' not found错误。

现在,我需要以某种方式来定义用于开发,登台和生产的自定义出版物,但是我真的不知道如何处理此问题,也找不到任何有关如何执行此操作的文档。

1 个答案:

答案 0 :(得分:1)

使用适当的参数找到了解决方法。现在,我的任务如下:

task sourcesJar(type: Jar, dependsOn: classes) {
    archiveClassifier = 'sources'
    from sourceSets.main.allSource
}

publishing {
    publications {
        pluginMaven(MavenPublication) {
            groupId = 'com.magicbluepenguin'
            artifactId = 'mbpplugin'
            if (project.hasProperty('versionArgs')) {
                version = version + project.findProperty('versionArgs')
            }
            artifact sourcesJar
        }
    }
}

现在,我可以通过调用以下命令继续将插件发布为开发版本:

./gradlew buildSrc:publishPluginMavenPublicationToMavenRepository -PversionArgs=-develop

然后通过调用不带有version参数的任务来发布发行版本。当然,这不是最灵活,最理想的解决方案,但现在,它使我可以继续前进。