- Создание задачи и использование ее в пользовательском плагине
- Автономный плагин
- Короткий идентификатор плагина
- Настройте параметры Gradle с помощью settings.gradle
Информация о проекте:
Версия Gradle: 1.1
Платформа ОС: Ubuntu 12.10
Необходимое условие: базовое понимание сценария Gradle.
Создание автономного пользовательского плагина
- создать структуру каталогов
0102030405060708091011121314151617
|-custom-plugin| |-plugin| |-src| |-main| | |-groovy| | | |-com| | | |-code4reference| | | |-gradle| | |-resources| | | |-META-INF| | | |-gradle-plugins| |-test| | |-groovy| | | |-com| | | |-code4reference| | | |-gradle|-userЗдесь каталог плагинов содержит весь исходный код и файлы ресурсов, в то время как каталог пользователя содержит пользовательский скрипт, который использует собственный плагин. Выполните следующую команду, чтобы создать структуру каталогов. Здесь groovy папка содержит пакет с исходным кодом.
123$mkdir-p custom-plugin/plugin/src/main/groovy/com/code4reference/gradle$mkdir-p custom-plugin/plugin/src/main/resources/META-INF/gradle-plugins$mkdir-p custom-plugin/user - Пользовательский исходный код плагина
Каждый плагин должен иметь класс реализации для расширения класса плагинов . Давайте определим класс плагина.
010203040506070809101112packagecom.code4reference.gradle;importorg.gradle.api.*;classCode4ReferencePluginimplementsPlugin {defvoidapply(Project project) {//c4rTask task has been defined below.project.task('c4rTask') << {println'Hi from Code4Reference plugin!'}}}Поместите этот файл в каталог custom-plugin / plugin / src / main / groovy / com / code4reference / gradle . Здесь была определена задача c4rTask для печати простой строки.
- Короткий идентификатор плагина
Чтобы применить плагин, мы обычно используем короткий идентификатор, например, применить плагин: ‘java’. Здесь «java» — это короткий идентификатор плагина для класса org.gradle.api.plugins.JavaPlugin . Короткий идентификатор плагина может быть определен в простых шагах. Для этого нам нужно создать файл свойств и поместить его в каталог META-INF / gradle-plugins, который находится в пути к классам. Имя файла будет нашим коротким идентификатором. Этот файл свойств должен содержать строку, показанную ниже, и он должен указывать на класс реализации плагина. Давайте создадим файл свойств как code4reference.properties и укажем его на класс Code4ReferencePlugin.
1implementation-class=com.code4reference.gradle.Code4ReferencePlugin - Gradle скрипт для генерации плагина
Для компиляции и сборки этого плагина мы напишем скрипт gradle. Создайте файл с именем build.gradle в каталоге плагинов и скопируйте в него содержимое ниже.
0102030405060708091011121314151617181920apply plugin:'groovy'apply plugin:'maven'dependencies {compile gradleApi()groovy localGroovy()}repositories {mavenCentral()}group='com.code4reference'//Group name makes easier to manager the packages.version='1.1-SNAPSHOT'uploadArchives {repositories {mavenDeployer {repository(url: uri('../repo'))}}}В этом скрипте gradle мы используем плагин groovy для компиляции исходного кода groovy и объявляем gradleAPI как зависимости времени компиляции. Возможно, вы заметили, что мы используем плагин Maven . Он в основном создает файл jar плагина и сохраняет его в репозитории maven. Здесь мы создаем репозиторий maven с именем repo в родительском каталоге и сохраняем в нем файл jar.
- Сборка плагина и размещение в репозитории
010203040506070809101112131415
$ gradle uploadArchives#This will put the plugin-version.jar in maven repository.:compileJava UP-TO-DATE:compileGroovy UP-TO-DATE:processResources UP-TO-DATE:classes UP-TO-DATE:jar:uploadArchivesUploading: com/code4reference/plugin/1.1-SNAPSHOT/plugin-1.1-20120816.163101-1.jar to repository remote atfile:/home/rakesh/programming/mygitrepo/Code4Reference/GradleExample/custom-plugin-1/repo/Transferring 5K from remoteUploaded 5KBUILD SUCCESSFULTotaltime: 34.892 secs - Настройки объекта с помощью settings.gradle
Когда вышеуказанная команда будет выполнена, gradle утомится, чтобы получить имя проекта из settings.gradle. Если файл settings.gradle отсутствует в текущем каталоге, он получает имя текущего каталога и принимает его в качестве имени проекта. Затем он формирует путь для сохранения файла JAR. Соглашение о пути к файлу выглядит следующим образом /group/name/projectName/version/projectname-version-timestamp.jar . В приведенном выше выводе вы можете заметить, что имя пути JAR и имя файла JAR имеют слово плагина, потому что текущим именем каталога является плагин, а Gradle принимает его как имя проекта. Если мы хотим переопределить это свойство и указать в качестве имени проекта code4ReferencePlugin , нам нужно создать файл settings.gradle в каталоге плагинов и поместить следующую строку.
1rootProject.name ='code4ReferencePlugin'Теперь снова выполните команду для создания файла jar плагина.
0102030405060708091011121314$gradle uploadArchivescompileJava UP-TO-DATE:compileGroovy UP-TO-DATE:processResources UP-TO-DATE:classes UP-TO-DATE:jar UP-TO-DATE:uploadArchivesUploading: com/code4reference/code4ReferencePlugin/1.1-SNAPSHOT/code4ReferencePlugin-1.1-20120816.164441-5.jar to repository remote atfile:/home/rakesh/programming/mygitrepo/Code4Reference/GradleExample/custom-plugin-1/repo/Transferring 5K from remoteUploaded 5KBUILD SUCCESSFULTotaltime: 8.61 secsТеперь проблема решена. Jar генерируется с именем code4ReferencePlugin- [version] -timestamp.jar. Если вы хотите узнать больше о свойствах gradle и system, найдите их здесь .
Используя пользовательский плагин
Это действительно простой шаг. Хотя мы используем другой плагин, пользовательский плагин также может использоваться аналогичным образом. Теперь создайте еще один файл build.gradle в каталоге пользователя и скопируйте приведенный ниже код.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
buildscript { repositories { maven { url uri('../repo') } } dependencies { classpath group: 'com.code4reference', name: 'code4ReferencePlugin', version: '1.1-SNAPSHOT' }}apply plugin: 'code4reference' |
Сценарий build.gradle обращается к репозиторию maven, который находится в родительском каталоге. Мы также определили зависимость, которая в основном обращается к конкретной версии файла JAR из Maven. И последнее, но не менее важное: мы применяем короткий идентификатор плагина «code4reference». Чтобы запустить этот скрипт gradle, выполните команду ниже на терминале в пользовательском каталоге.
|
1
2
3
4
5
6
7
8
|
$ gradle c4rTask #Remember we have created c4rTask in Code4ReferencePlugin class. #You will get the following output.:c4rTaskHi from Code4Reference plugin!BUILD SUCCESSFULTotal time: 3.908 secs |
Вуаля !! Вы только что создали собственный плагин и использовали его в другом скрипте проекта. Вы можете найти исходный код этого руководства здесь . Code4Reference
Теперь рассмотрим следующие темы.
- Определить пользовательский класс задач
- Передача аргументов в пользовательскую задачу плагина
- Вложенные аргументы
- Тестирование пользовательского плагина
Информация о проекте:
Название проекта: пользовательский плагин Gradle
Версия Gradle: 1.1
Платформа ОС: Ubuntu 12.10
Необходимое условие: базовое понимание сценария Gradle.
Здесь мы будем следовать той же иерархии каталогов, перечисленной в первой части.
- Определить пользовательскую задачу
Давайте определим пользовательский класс с именем Code4ReferenceTask, который расширяет класс DefaultTask, и поместим этот файл в ту же папку, где хранится Code4ReferencePlugin.groovy. Этот класс содержит метод с именем showMessage (), который аннотируется @TaskAction . Gradle вызывает этот метод при выполнении задачи.
010203040506070809101112packagecom.code4reference.gradle;importorg.gradle.api.DefaultTaskimportorg.gradle.api.tasks.TaskActionclassCode4ReferenceTaskextendsDefaultTask {@TaskActiondef showMessage() {println'----------showMessage-------------'}}Теперь нам нужно сделать небольшие изменения в Code4ReferencePlugin.groovy, чтобы включить пользовательскую задачу. Модифицированный класс Code4ReferencePlugin выглядит следующим образом.
01020304050607080910packagecom.code4reference.gradle;importorg.gradle.api.*;classCode4ReferencePluginimplementsPlugin {defvoidapply(Project project) {//Define the task named c4rTask of type Code4ReferenceTaskproject.task('c4rTask', type: Code4ReferenceTask)}}Вы можете заметить, что только выделенная строка была изменена из прошлой реализации. Теперь «c4rTask» имеет тип Code4ReferenceTask. Выполните команду gradle uploadArchives в каталоге плагинов . Это обновит файл jar в репозитории Maven. Теперь выполните команду ниже в пользовательском каталоге с тем же старым build.gradle. Мы получим следующий вывод.
123456$gradle c4rTask:c4rTask----------showMessage-------------BUILD SUCCESSFULTotaltime: 14.057 secs - Передача аргументов в пользовательскую задачу плагина
Вышеуказанная реализация является самой простой и не делает много. Что если мы хотим передать аргументы из скрипта Gradle этой задаче? Мы можем достичь этого путем доступа к объекту расширения . Gradle Project имеет связанный объект ExtensionContainer, который помогает отслеживать все параметры и свойства, передаваемые в класс плагинов. Давайте определим класс расширения, который может содержать аргументы и передавать их в класс Task. Выделенные строки в классе Code4ReferencePlugin помогают передавать аргументы в класс Task.
010203040506070809101112131415packagecom.code4reference.gradle;importorg.gradle.api.*;//For passing arguments from gradle script.classCode4ReferencePluginExtension {String message ='Hello from Code4Reference'String sender ='Code4Reference'}classCode4ReferencePluginimplementsPlugin {defvoidapply(Project project) {project.extensions.create('c4rArgs', Code4ReferencePluginExtension)project.task('c4rTask', type: Code4ReferenceTask)}}Мы определили Code4ReferencePluginExtension как класс Extension, который содержит две переменные message и sender. Они служат аргументами для пользовательской задачи. Нам нужно изменить класс Code4RefernceTask для доступа к аргументам. Выделенные строки были добавлены в предыдущую реализацию класса Code4ReferenceTask.
0102030405060708091011121314packagecom.code4reference.gradle;importorg.gradle.api.DefaultTaskimportorg.gradle.api.tasks.TaskActionclassCode4ReferenceTaskextendsDefaultTask {@TaskActiondef showMessage() {println'------------showMessage-------------------'println 'From : ${project.c4rArgs.sender},\message : ${project.c4rArgs.message}'}}Выполните команду gradle uploadArchives в каталоге плагинов. Это обновит файл jar в репозитории Maven. Также нам нужно обновить build.gradle в пользовательском каталоге.
0102030405060708091011121314151617181920//custom-plugin-2/userbuildscript {repositories {maven {url uri('../repo')}}dependencies {classpath group:'com.code4reference',name:'code4ReferencePlugin',version:'1.2-SNAPSHOT'}}apply plugin:'code4reference'c4rArgs {sender ='Rakesh'message ='Hello there !!!!'}Возможно, вы заметили, что закрытие c4rArgs было добавлено и переменные отправителя и сообщения установлены в закрытии. Эти две переменные доступны в методе showMessage (). Теперь запустите build.gradle, присутствующий в пользовательском каталоге. мы получаем следующий вывод.
12345678$gradle c4rTask:c4rTask-------------------------showMessage-----------------------------From : Rakesh, message : Hello there !!!!BUILD SUCCESSFULTotaltime: 15.817 secs - Вложенные аргументы
Что если мы хотим передать вложенные аргументы? Мы можем достичь этого, вложив объекты Extension. Вот код для класса Code4ReferencePlugin. В этом классе были добавлены только выделенные строки.
0102030405060708091011121314151617181920212223packagecom.code4reference.gradle;importorg.gradle.api.*;//Extension class for nested argumetnsclassC4RNestedPluginExtention {String receiver ='Admin'String email ='admin@code4reference.com'}//For keeping passing arguments from gradle script.classCode4ReferencePluginExtension {String message ='Hello from Code4Reference'String sender ='Code4Reference'C4RNestedPluginExtention nested =newC4RNestedPluginExtention()}classCode4ReferencePluginimplementsPlugin {defvoidapply(Project project) {project.extensions.create('c4rArgs', Code4ReferencePluginExtension)project.c4rArgs.extensions.create('nestedArgs',C4RNestedPluginExtention)project.task('c4rTask', type: Code4ReferenceTask)}}Пришло время изменить класс Code4ReferenceTask. Выделенные строки были добавлены в этот класс для доступа к вложенным аргументам.
01020304050607080910111213141516packagecom.code4reference.gradle;importorg.gradle.api.DefaultTaskimportorg.gradle.api.tasks.TaskActionclassCode4ReferenceTaskextendsDefaultTask {@TaskActiondef showMessage() {println'------------showMessage-------------------'println 'From : ${project.c4rArgs.sender},\message : ${project.c4rArgs.message}'println 'To : ${project.c4rArgs.nestedArgs.receiver},\email : ${project.c4rArgs.nestedArgs.email}'}}Снова выполните команду gradle uploadArchives в каталоге плагинов, чтобы обновить файл jar в репозитории Maven. Теперь измените файл build.gradle, присутствующий в пользовательском каталоге, чтобы передать вложенные аргументы.
010203040506070809101112131415161718192021222324buildscript {repositories {maven {url uri('../repo')}}dependencies {classpath group:'com.code4reference',name:'code4ReferencePlugin',version:'1.2-SNAPSHOT'}}apply plugin:'code4reference'c4rArgs {sender ='Rakesh'message ='Hello there !!!!'nestedArgs{receiver ='gradleAdmin'email ='gradleAdmin@code4reference.com'}}Мы добавили выделенную строку в файл build.gradle.
- Плагин тестирования и задача
Тестирование кода является важным аспектом разработки кода. Теперь мы собираемся добавить модульный тест для пользовательского задания и плагина. Для этого нам нужно создать структуру каталогов для тестовых классов. Нам нужно поместить тестовую папку в каталог src. Выполните команду ниже в каталоге плагинов, чтобы создать тестовые каталоги.
1$mkdir-p src/test/groovy/com/code4reference/gradle/Тестовая структура каталогов следует той же структуре каталогов пакетов, которая использовалась для каталогов пакетов исходного кода. В этом каталоге поместите тестовые классы для Code4ReferencePlugin и Code4ReferenceTask. В тестовом классе ProjectBuilder используется для доступа к объекту проекта. Эти тестовые сценарии легко написать, как и тестовые примеры Junit. Код тестовых классов выглядит следующим образом:
010203040506070809101112131415packagecom.code4reference.gradle;importorg.junit.Testimportorg.gradle.testfixtures.ProjectBuilderimportorg.gradle.api.Projectimportstaticorg.junit.Assert.*classCode4ReferenceTaskTest {@TestpublicvoidcanAddTaskToProject() {Project project = ProjectBuilder.builder().build()def task = project.task('c4rtakstest', type: Code4ReferenceTask)assertTrue(taskinstanceofCode4ReferenceTask)}}01020304050607080910111213141516packagecom.code4reference.gradle;importorg.junit.Testimportorg.gradle.testfixtures.ProjectBuilderimportorg.gradle.api.Projectimportstaticorg.junit.Assert.*classCode4ReferencePluginTest {@Testpublicvoidcode4referencePluginAddsCode4ReferenceTaskToProject() {Project project = ProjectBuilder.builder().build()project.apply plugin:'code4reference'println'code4referencePluginAddsCode4ReferenceTaskToProject'assertTrue(project.tasks.c4rTaskinstanceofCode4ReferenceTask)}}Чтобы запустить тест, выполните следующую команду в папке плагина.
010203040506070809101112131415161718192021222324252627282930313233343536373839404142$gradletest#For success test cases.:compileJava UP-TO-DATE:compileGroovy UP-TO-DATE:processResources UP-TO-DATE:classes UP-TO-DATE:compileTestJava UP-TO-DATE:compileTestGroovy:processTestResources UP-TO-DATE:testClasses:testBUILD SUCCESSFULTotaltime: 42.799 secs$gradletest#In case of test case failure,#you can expect output similar to given below.:compileJava UP-TO-DATE:compileGroovy UP-TO-DATE:processResources UP-TO-DATE:classes UP-TO-DATE:compileTestJava UP-TO-DATE:compileTestGroovy:processTestResources UP-TO-DATE:testClasses:testcom.code4reference.gradle.Code4ReferencePluginTest > code4referencePluginAddsCode4ReferenceTaskToProject FAILEDjava.lang.AssertionError at Code4ReferencePluginTest.groovy:142 tests completed, 1 failedFAILURE: Build failed with an exception.* What went wrong:Execution failedfortask':test'.> There were failing tests. See the report at:file:///home/rakesh/programming/mygitrepo/Code4Reference/GradleExample/custom-plugin-2/plugin/build/reports/tests/index.html* Try:Run with --stacktrace option to get the stack trace. Run with --info or --debug option to getmorelog output.BUILD FAILEDGradle test предоставляет протокол испытаний и его местонахождение. Этот файл можно открыть с помощью любого браузера для проверки трассировки стека.
Вы можете найти исходный код здесь .
Справка: пользовательский плагин Gradle (часть-1) , Пользовательский плагин Gradle (часть 2) от нашего партнера по JCG Ракеша Кусата в блоге Code4Reference .