前言
最近在学习gradle plugin的编写,发布gradle plugin这是很直接的需求,我写这篇文章一是纪录如何学习、二是如何举一反三。
需求
公司会有各种原因让你编写gradle plugin,当编写完gradle plugin后,你的目标一定是推广给你团队的小伙伴,这篇文章主要就是帮助你解决这个问题。
通常你有两种选择:
1、在工程中编译gradle plugin插件到本地,local引用
2、上传gradle plugin到远程仓库,remote引用
示例
现在我们已butterknife为例,它的接入方式如下
To use Butter Knife in a library, add the plugin to your buildscript
:
buildscript {
repositories {
mavenCentral()
google()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'
}
}
and then apply it in your module:
apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'
是不是so easy,通常这也是标准方案。别急,我们先简单分析一下:
classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'
这是什么意思?如果你接触过gradle plugin的编写的话,很容易就看出这是一个gradle plugin,并且已经发布在远程仓库中。它的意思是,这个插件GroupId
是com.jakewharton
,ArtifactId
是butterknife-gradle-plugin
,Version
是10.2.3
发布在远程仓库上。
接着看第二句:
apply plugin: 'com.jakewharton.butterknife' 意思是在module中引入该插件,该插件的入口配置文件是
com.jakewharton.butterknife.properties
,接着我们从源码工程结构验证:
举一反三
我们看出只需发布gradle plugin 就可以满足要求。接下来问题定位为,只需了解如何发布gradle plugin
到远程仓库
即可。
我的思路是,类比上一篇文章构建你的私有仓库,发布你的库,提高工程构建速度发布aar
的方式就行,当我满怀信心的clean->assemble ->publish -> artifactoryPublish ,水到渠成,如下图。
但是当我在app工程中使用
的时候,app根目录build.gradle
plugins {
id 'com.android.application'
id 'com.donews.gradle.plugin'
}
提示一个错误
Build file 'C:\dev\android\gradle-tools\app\build.gradle' line: 3
Plugin [id: 'com.donews.gradle.plugin'] was not found in any of the following sources:
说明我上传到远程仓库存在问题,即发布aar
的方式和发布gradle plugin
有区别
。
寻找资料学习
那么要正确的发布到远程仓库现在面临查资料,我的方式是搜关键字gradle plugin publish
,出来很多文章,其中有一条结果指向官网gradle官网,有一个发布gradle plugin
步骤指南,简单来讲以下步骤:
1、注册账号,获取publishKey和publishSecret,配置gradle.properties
2、引入发布插件java-gradle-plugin、maven-publish、com.gradle.plugin-publish
3、配置发布你要发布的插件
代码如下:
plugins {
id 'java-gradle-plugin'
id 'maven-publish'
id 'com.gradle.plugin-publish' version '0.12.0'
}
pluginBundle {
website = 'http://www.okwyx.com'
vcsUrl = 'http://www.okwyx.com'
tags = ['publish']
}
////////////////////////////////////////////////////////////////
def globalGroupId = "com.donews.tools.gradle"
def globalArtifactId = "commonTools"
def globalVersion = "0.0.5"
def globalContextUrl = "http://localhost:8081/artifactory"
def globalRepoKey = "android_gradle_plugins_local"
def globalUserName = "admin"
def globalPassword = "password"
////////////////////////////////////////////////////////////////
group = globalGroupId
version = globalVersion
gradlePlugin {
plugins {
greetingsPlugin {
id = globalGroupId
displayName = 'Check code Common tools'
description = 'Check androidStudio project tools'
implementationClass = 'com.donews.gradle.CommonTools'
}
}
}
//发布到官方结束
执行发布代码:
gradlew publishPlugins
发布成功,显示等待审核中
听网上人说审核需要三四天时间,这...等于是没法测试了,显然我不愿意等三四天。那如果使用我之前自建Artifactory
私有仓库呢,理论可行。接下来就是搜索如何发布到gradle plugin
到Artifactory
,但是基本上石沉大海,到了官网example案例,也基本上没有这部分内容(或者是我没看到)。
再次举一反三
此时唯一的办法是继续借助butterknife的发布,因为它必定也有此类需求,仔细看,它有一行这样的代码
这不就是我之前发布到本地代码的变种吗
//groovy 本地仓库,调试使用
uploadArchives {
repositories.mavenDeployer {
repository(url: uri('../repositories'))//存放路径
pom.groupId = globalGroupId//工程组的标识,一般为公司名称
pom.artifactId = globalArtifactId//工程的标识,一般为项目名称
pom.version = globalVersion//版本号
}
}
那我只需要把url
改成本地的私有仓库路径
加上登入的账号和密码就行了,实验一下
uploadArchives {
repositories.mavenDeployer {
repository(url: "http://localhost:8081/artifactory/android_gradle_plugins_local/"){
authentication(userName: "$Artifactory账号", password: "$Artifactory密码")
}
pom.groupId = globalGroupId//工程组的标识,一般为公司名称
pom.artifactId = globalArtifactId//工程的标识,一般为项目名称
pom.version = globalVersion//版本号
}
}
执行发布代码:
gradlew clean
gradlew gradle_plugin:assemble
gradlew gradle_plugin:uploadArchives
查看本地仓库代码:
发布成功了,接着app工程引入该插件
plugins {
id 'com.android.application'
id 'com.donews.gradle.plugin'
}
发布成功,后续就可以友好的编写gradle plugin,发布到Artifactory
私服仓库中了,无需等待审核,给小伙伴引入你的私有库,使用起来吧。