Überblick
Startete eine neue Serie, diese Serie des Lernens von Gradle. Das Ziel ist es, Gradle gründlich zu verstehen, hauptsächlich Notizen zu machen, die Sie verstehen, um das Vergessen zu verhindern
Gradle-Serie (1): Grooviges Lernen
Gradle-Lernserie (zwei): Gradle-Kernentschlüsselung
Gradle-Lernserie (3): Gradle-Plugin
Einführung
Gradle selbst bietet nur grundlegende Kernfunktionen, und andere Funktionen wie die Fähigkeit zum Kompilieren von Java-Quellcode, die Fähigkeit zum Kompilieren von Android-Projekten usw. müssen über Plug-Ins implementiert werden.
Um Plug-Ins verwenden zu können, müssen Sie die Anwendung über Anwendungs-Plug-Ins Project.apply()
in das Projekt einbinden , um die Methode abzuschließen.
In Gradle gibt es im Allgemeinen zwei Arten von Plug-Ins: 脚本插件
und 对象插件
.
脚本插件
Es ist ein zusätzliches Build-Skript, das den Build weiter konfiguriert, was als normales build.gradle verstanden werden kann.
对象插件
Diese Klasse wird auch als binäres Plug-In bezeichnet und implementiert die Plugin-Schnittstelle. Im Folgenden wird ihre Verwendung beschrieben.
Skript-Plugin
Zum Beispiel erstellen wir eine im Stammverzeichnis des Projektsutils.gradle
def getxmlpackage(boolean x){
def file=new File(project.getProjectDir().getPath()+"/src/main/AndroidManifest.xml");
def paser = new XmlParser().parse(file)
return paser.@package
}
ext{
getpackage = this.&getxmlpackage
}
Dies ist ein einfaches Skript-Plugin, und verweisen Sie dann auf dieses Skript-Plugin im App-Moudle
apply from: rootProject.getRootDir().getAbsolutePath() + "/utils.gradle"
Anschließend können Sie die Methode im Skript-Plugin aufrufen
Objekt-Plugin
Objekt-Plug-Ins sind Plug-Ins, die die Schnittstelle org.gradle.api.plugins implementieren. Objekt-Plug-Ins können in interne Plug-Ins und Plug-Ins von Drittanbietern unterteilt werden.
Internes Plugin
Das Gradle-Paket enthält eine große Anzahl von Plugins, z. B. die Java-Plugins und C-Plugins, die wir häufig verwenden. Wir können sie direkt importieren
apply plugin:'java'
apply plugin:'cpp'
Drei-Parteien-Plug-In
Das Objekt-Plug-In eines Drittanbieters ist normalerweise eine JAR-Datei. Wenn das Build-Skript die Existenz des Plug-Ins eines Drittanbieters kennen soll, müssen Sie Buildscrip verwenden, um es festzulegen.
Definieren Sie das ursprüngliche Warehouse, in dem sich das Plugin befindet, und die Abhängigkeiten des Plugins in Buildscrip und konfigurieren Sie es anschließend mit der Methode apply. Das Android Gradle-Plugin ist auch ein Plugin eines Drittanbieters. Wenn wir das Android Gradle-Plugin einführen möchten, können wir schreiben:
buildscript {
repositories {
//配置仓库
google()
jcenter()
}
dependencies {
//配置插件依赖
classpath 'com.android.tools.build:gradle:3.5.3'
}
}
//然后就可以在需要的地方引入android 插件了
apply plugin: 'com.android.application'
Benutzerdefiniertes Objekt-Plugin
Das Anpassen eines Plug-Ins dient hauptsächlich der Implementierung von org.gradle.api.Plugin
Skript erstellen
Diese Methode schreibt den Plug-In-Code direkt in das Build-Skript. Diese Methode kann jedoch nur in dieser Datei verwendet werden. Ich füge beispielsweise den folgenden Code direkt in das build.gradle der App ein
class myPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
println("myPlugin 执行了")
project.task("myTask"){
doLast {
println("myTask执行了")
}
}
}
}
Importieren Sie dann das in dieser Datei definierte Plugin
apply plugin: myPlugin
Dies dient dazu, ein Plug-In direkt in build.gradle zu implementieren und eine MyTask
Aufgabe im Plug-In zu definieren . Dieses Plug-In kann jedoch nur in dieser Datei verwendet werden. Wir führen die Mytask
Aufgabe direkt aus./gradlew MyTask
> Task :mylibrary2:myTask
myTask执行了
执行阶段,task ':mylibrary2:myTask'耗时:1ms
Wir verwenden die auf diese Weise implementierten Plug-Ins im Allgemeinen nicht, da diese zu restriktiv ist und nur in diesem Projekt verwendet werden kann, nicht jedoch in anderen Projekten.
buildSrc-Projekt
buildSrc ist das Standard-Plug-In-Verzeichnis von Gradle. Dieses Verzeichnis wird automatisch erkannt, wenn Gradle kompiliert wird, und der darin enthaltene Code wird in ein Plug-In kompiliert.
-
Erst erst ein benanntes
buildSrc
Java-Modul erstellen , dann nur behaltenbuild.gradle
und dassrc/main
Verzeichnis, alle anderen löschen, auf den Namen achten muss seinbuildSrc
, sonst wird das Plug-In nicht gefunden -
Ändern Sie dann den Inhalt in Gradle
apply plugin: 'groovy' //必须
apply plugin: 'maven'
dependencies {
implementation gradleApi() //必须
implementation localGroovy() //必须
//如果要使用android的API,需要引用这个,实现Transform的时候会用到
//implementation 'com.android.tools.build:gradle:3.3.0'
}
repositories {
google()
jcenter()
mavenCentral() //必须
}
//把项目入口设置为src/main/groovy
sourceSets {
main {
groovy {
srcDir 'src/main/groovy'
}
}
}
-
Erstellen Sie ein Eintragsverzeichnis, erstellen Sie ein Code-Eingabeverzeichnis unter src / main wie folgt:
-
Implementieren Sie dann den Plug-In-Code
Text.groovy
, achten Sie auf das Dateisuffixgroovy
, die Datei sollte importiert werdenpackage com.renxh
package com.renxh
import org.gradle.api.Plugin
import org.gradle.api.Project
class Text implements Plugin<Project>{
@Override
void apply(Project project) {
println("执行自定义插件")
project.task("haha"){
doLast{
println("执行自定义插件 haha task")
}
}
}
}
main
Erstellen Sie als Nächstes einresources
Verzeichnis unter demresources
Verzeichnis, erstellen Sie einMETA-INF
Verzeichnis unter demMETA-INF
Verzeichnis, erstellen Sie eingradle-plugins
Verzeichnis unter demgradle-plugins
Verzeichnis und erstellen Sie eineproperties
Datei unter dem Verzeichnisproperties
Die Datei kann von Ihnen selbst benannt werden, muss jedoch.properties
enden, zcom.renxh.plugin.properties
- Schließlich müssen wir
properties
die Klasse angeben, in der wir das Plug- In in der Datei implementierenimplementation-class=com.renxh.Text
Bisher wurde unser Plug-In-Projekt geschrieben. Führen Sie das Plug-In ein, das wir im Modul geschrieben haben apply plugin:'com.renxh.plugin'
, und führen Sie dann die Aufgabe des Plug-Ins aus../gradlew haha
Ausgabe
> Task :mylibrary:haha
执行自定义插件 haha task
执行阶段,task ':mylibrary:haha'耗时:0ms
Diese Form des Schreibens kann in den Modulen unseres gesamten Projekts verwendet werden, ist jedoch nur auf dieses Projekt beschränkt und kann nicht in anderen Projekten verwendet werden.
Benutzerdefiniertes Modul, Maven hochladen
Die zweite Möglichkeit, Plug-Ins zu schreiben, kann nur in diesem Projekt verwendet werden, während andere Projekte nicht verwendet werden können. Manchmal benötigen wir ein Plug-In, um in mehreren Projekten verwendet zu werden, und dann müssen wir das Plug-In in maven hochladen
- Erstellen Sie zuerst einen
java module
, der Name kann beliebig sein, nur behaltenbuild.gradle
undsrc/main
andere Dateien werden gelöscht - Ändern Sie den Inhalt in Gradle
apply plugin: 'groovy' //必须
apply plugin: 'maven' //要想发布到Maven,此插件必须使用
dependencies {
implementation gradleApi() //必须
implementation localGroovy() //必须
}
repositories {
mavenCentral() //必须
}
def group='com.renxh.cusplugin' //组
def version='2.0.0' //版本
def artifactId='myplugin' //唯一标示
//将插件打包上传到本地maven仓库
uploadArchives {
repositories {
mavenDeployer {
pom.groupId = group
pom.artifactId = artifactId
pom.version = version
//指定本地maven的路径,在项目根目录下
repository(url: uri('../repos'))
}
}
}
Im Vergleich zur buildSrc
Lösung wird dadurch die Maven-Unterstützung und eine uploadArchives
solche Aufgabe hinzugefügt. Die Aufgabe dieser Aufgabe besteht darin, das lokale Plug-In zu verpacken und in das lokale Maven-Warehouse hochzuladen. Hier sind ../repos
die Repos im Projektstammverzeichnis aufgeführt. Die beiden .
Rollbacks zweimal Rollback in das Projektstammverzeichnis
Beim src/main
Generieren einer groovy
Datei und Generieren properties
einer Datei sowie beim buildSrc
Programmieren der Konvergenz
Schreiben Sie ein Plug-In
class CustomPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
project.task("cusplugin"){
doLast{
println("cusplugin任务执行111")
}
}
}
}
./gradlew CusPlugin:uploadArchives
Führen Sie dann die Aufgabe uploadArchives aus, und ordnen Sie das Repos-Verzeichnis wie in der Abbildung gezeigt im Projektstammverzeichnis an:
repos
Directory ist ein lokales Maven
Lager, com/renxh/cusplugin
in dem Skript angegeben wird group
, myplugin
im Namen Skriptmodul angegeben ist, ist eine eindeutige Kennung, ist das Skript 1.0.0version
- Nach dem Generieren des lokalen Maven-Repositorys müssen Sie auf die Plugins im lokalen Maven-Repository verweisen. Zunächst müssen Sie der build.gralde im Stammverzeichnis Folgendes hinzufügen:
buildscript {
repositories {
google()
jcenter()
//引入本地仓库
maven {
url uri('./repos') //指定本地maven的路径,在项目根目录下
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
//引入本地仓库中的插件依赖
classpath 'com.renxh.cusplugin:myplugin:1.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
- Das durch classpath angegebene Pfadformat lautet wie folgt:
Diese drei Parameter werden im build.gradle
Skript konfiguriert, wenn das Warehouse generiert wird
classpath '[groupId]:[artifactId]:[version]'
- Nach der Konfiguration kann es im Modul verwendet werden
apply plugin: 'com.android.application'
apply from: rootProject.getRootDir().getAbsolutePath() + "/utils.gradle"
apply plugin:'com.renxh.cusplugin'
- Schließlich können Sie die Aufgaben im Plugin ausführen
./gradlew app:cusplugin
> Task :app:cusplugin
cusplugin任务执行111
执行阶段,task ':app:cusplugin'耗时:0ms
Erweiterung des Plugins
Wir können auch Parameter für das Plug-In konfigurieren, wenn das Plug-In ausgeführt wird. Das Plug-In Extension
wird verwendet, um die Parameter an das Plug-In zurückzugeben
Unten werde ich das obige Plug-In ergänzenExtension
Erstellen Sie zuerst eine Entitätsklasse, um Parameter zu empfangen
package com.renxh.cusplugin
class MyExtension {
String name;
int age;
}
Gehen Sie dann zur Plugin-Klasse, um die Erweiterung hinzuzufügen
class CustomPlugin implements Plugin<Project>{
@Override
void apply(Project project) {
//添加扩展
project.extensions.add('myextension',MyExtension)
project.task("cusplugin"){
doLast{
println("cusplugin任务执行111")
MyExtension extension = project.myextension
//3.输出插件扩展属性
println ">>>>>> name: ${extension.name} age:${extension.age}"
}
}
}
}
- Fügen Sie der Erweiterung über project.extensions.add die angepasste Entitätsklasse hinzu und geben Sie ihr einen Namen
- Rufen Sie dann die erweiterte Entitätsklasse mit dem Namen ab
- Holen Sie sich schließlich die Attribute in der Erweiterung
Laden Sie den Maven nach der Änderung erneut hoch
Nach dem Hochladen können Sie die erweiterte Entitätsklasse im Modul verwenden
apply plugin: 'com.android.application'
apply from: rootProject.getRootDir().getAbsolutePath() + "/utils.gradle"
apply plugin:'com.renxh.cusplugin'
myextension{
name 'renxh'
age 27
}
Führen Sie abschließend die Aufgabe im Plugin aus,./gradlew app:cusplugin
> Task :app:cusplugin
cusplugin任务执行111
>>>>>> name: renxh age:27
执行阶段,task ':app:cusplugin'耗时:2ms