文章目录
- 一、前言
- 二、环境版本
- 三、代码
- 四、插件使用
- 五、参考链接
一、前言
上一篇记录了使用buildSrc
的方式创建gradle
插件,但是这种方式只能当前项目的不同模块使用。所以如果将代码发布到云端就可以使大家都可以使用了,这种方式大家通常使用maven
或者ivy
,不过目前使用maven
的居多。maven
不仅可以发布到云端也可以发布到本地供不同的项目使用。由于云端需要创建各种账号,比较繁琐,这里仅记录如何发布到本地。以后想修改成云端发布时候,只需要填写上地址和账号即可。
二、环境版本
该代码是在Mac上进行开发的,不过这个不重要,这里记录下主要的开发环境版本
Android Studio: Android Studio Arctic Fox | 2020.3.1 Patch4
gradle: 7.0.2
android_gradle: 7.0.4
三、代码
该插件的创建方式是通过在一个Android
项目中创建的(其实更应该是单独创建一个插件项目而不是这种方式,不过该方式可以做到很方便的测试)。其整体结构目录如下:
这里代码主要放在java
目录下面。采用java
语言编写,而不是groovy
。具体原因稍后解释。
java
包下面是定义的包名,所以plugin
可以写成自己想要定义的包名。
test-gradle.properties
该文件名可以随便定义,名字可以用来在后面引用插件。
将该模块添加进项目根目录的settings.gradle
中。其中代码定义如下:
settings.gradle
dependencyResolutionManagement {
// repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenLocal()
mavenCentral()
jcenter() // Warning: this repository is going to shut down soon
maven { url 'https://jitpack.io' }
}
}
rootProject.name = "My Application"
include ':app'
include ':lib'
include ':test-plugin'
其中需要注意要注释掉以下代码:
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
然后打开test-plugin/build.gradle
文件。其内容如下:
build.gradle
plugins {
id 'maven-publish'
id 'java-library'
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "com.android.tools.build:gradle:7.0.4"
implementation gradleApi()
implementation localGroovy()
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10"
}
publishing {
publications {
maven(MavenPublication) {
groupId = 'com.test.plugin'
artifactId = 'ym'
version = '1.0.0'
from components.java
}
}
repositories {
maven {
// change to point to your repo, e.g. http://my.org/repo
url = layout.buildDirectory.dir('repo')
}
}
}
java {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
sourceSets {
main {
java {
srcDir 'src/main/java'
}
// groovy {
// srcDir 'src/main/groovy'
// }
// resources {
// srcDir 'src/main/resources'
// }
}
}
这里需要注意sourceSets
里面注释的函数,这两个函数表示是不存在的,所以如果像之前那样定义groovy
是无法找到里面的文件的。所以是不能定义groovy
文件。
打开test-gradle.properties
,定义以下内容,该内容表示了插件入口:
其内容为包名+类名
implementation-class=plugin.TestPlugin
定义完后可以build
下程序以便在编写代码时候可以使用代码联想功能。接下来定义插件内容
TestPlugin.java
package plugin;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
class TestPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
System.out.println("打印的第四种方式-test");
}
}
编写完毕后重新build
项目,然后进行发布到本地。
打开右侧Gradle
窗口执行pubilsh
任务。如下图所示:
如果选择...ToMAvenLocal
来发布的话则会发布到本地,这样mavenLocal()
函数就可以使用了,否则只是使用pubilsh
的话,只会执行自己编写的发布方式,比如该文的发布到repo
文件夹中,如果要使用这里的话需要在maven仓库中指定插件查找位置
这样插件就发布完成了。
四、插件使用
插件发布完成就可以使用了,这里还在这个项目中进行使用。
打开项目根目录下build.gradle
文件进行引入插件。代码如下所示:
build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
mavenCentral()
mavenLocal()//该仓库主要是引入本地插件的仓库。一般本地发布的插件就会通过这个方式进行引入
maven { url 'https://jitpack.io' }
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.4'
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10'
classpath 'com.test.plugin:ym:1.0.0'
//该命名规则是通过插件里面build.gradle里面的publications中定义的属性进行编写
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
然后在app/build.gradle
中进行使用插件。如下:
build.gradle
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'test-gradle' //该名字就是之前定义的test-gradle.properties的文件名
}
android {
...
...
}
然后重新build
文件,会看到编译过程中打印出插件中定义的日志
如果上文还有不太了解的或者遇到来其它问题,可以仔细月底参考链接的前三篇文章:
由于该内容在开发过程中较为复杂,所以将代码上传至github上以供参考:https://github.com/mayangming/gradlePluginTest/tree/master