У меня есть плагин Gradle, который компилируется и работает так, как ожидалось. Я хотел бы распространить с исходным кодом пример приложения с помощью плагина Gradle, который также позволит мне легко протестировать изменения в плагине. Теперь для этого я должен добавить зависимость класса к блоку buildScript
. Можно ли добавить зависимый локальный плагин, который будет скомпилирован с примером проекта? Основная проблема, с которой я сейчас сталкиваюсь, заключается в том, что плагин не существует при попытке синхронизации проекта примера, приводящего к сбою.
Добавление локального плагина в проект Gradle
Ответ 1
Если писать интеграционные тесты - ваша конечная цель, я по-прежнему рекомендую использовать ProjectBuilder. Вы можете увидеть пример этого в разделе 39.5.4 здесь. В источнике gradle есть примеры более реалистичного тестирования в реальном мире. См. здесь пример.
Сказав это, мне стало интересно, какой именно вопрос вы разместили, и попробовал несколько вещей. Для меня это работало:
buildscript{
repositories{
...
}
dependencies{
classpath files('relative/path/to/plugin.jar')
}
}
apply plugin: fully.qualified.package.PluginClassName
Обратите внимание, что имя класса не заключено в '
кавычки '
, чтобы сделать его строкой.
Это не очень полезно, поскольку для этого объявления требуется, чтобы plugin.jar
был создан и доступен до того, как проект, использующий плагин, будет построен, но в этот момент вы также можете быть зависимы от внешней зависимости репо.
Вторая проблема заключается в том, что транзитивные зависимости проекта плагина автоматически не добавляются в ваш проект-плагин.
Я не мог получить зависимость проекта, например classpath project(':plugin-project')
, от работы внутри buildscript.
Один (крайне хакерский) способ обеспечить, чтобы проект плагина всегда строился и был доступен при построении проекта plugin-consumer, чтобы иметь "родительский" build.gradle, который всегда создает плагин сначала, прежде чем строить потребительский проект. я загрузил пример здесь.
Ответ 2
Я сталкиваюсь, когда хочу отлаживать мой gradle plugin
в Android Studio, я решаю его наконец.
Сначала загрузите gradle plugin
в локальный maven.
apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'maven'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile gradleApi()
}
sourceCompatibility = "1.7"
targetCompatibility = "1.7"
group='com.egos.gradle.plugins'
name='plugintest'
version='0.0.1'
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri('../repo'))
}
}
}
выполнить gradle uploadArchives
. Затем используйте локальный плагин.
buildscript {
repositories {
maven {
url uri('../repo')
}
}
dependencies {
classpath group: 'com.egos.gradle.plugins',
name: 'plugintest',
version: '0.0.1'
}
}
apply plugin: 'com.egos'
Ответ 3
В текущей версии Gradle (3.3 на момент написания) вы можете использовать функцию Composite Build для замены зависимостей плагина.
Например, вы можете собрать ваш пример проекта с помощью следующей команды (запустите в корне вашего примера проекта): gradle build --include-build/path/to/local-plugin
Это поднимет ваш плагин из вашего локального каталога. Он даже сначала собрал ваш плагин, а затем собрал ваш пример проекта с только что созданным плагином в качестве зависимости.
Эта функция также поддерживается IDE: Простые инструкции по настройке Composite Build в IntelliJ
См. Документы здесь: https://docs.gradle.org/current/userguide/composite_builds.html.
Обратите внимание, что замена плагинов работает только с блоком buildscript, но не с блоком плагинов.
Ответ 4
Дополнение к вышеприведенному ответу. Вы также должны добавить "gradlePlugin" вместе с "uploadArchives" что-то вроде ниже:
gradlePlugin {
plugins {
testgen {
id = "com.egos.gradle.plugins"
implementationClass = "com.egos.gradle.plugins.<PluginClassName>"
}
}
}
вместо этого установите ваше имя класса плагина. Отдых остается таким же, как и выше. Спасибо!
Ответ 5
Как заметил Дорон, нашел чистый способ сделать это с помощью композитных сборок. Вот эти шаги:
- Определите ваш плагин с
build.gradle
который имеетgroup
:
// some-plugin/build.gradle
...
group = "some.group.id"
...
- Ссылайтесь на ваш проект в
settings.gradle
следующим образом:
// settings.gradle
...
includeBuild 'some-plugin'
- В своих проектах вы можете использовать плагин:
// some-project/build.gradle
buildscript {
dependencies {
classpath "some.group.id:some-plugin"
}
}
apply(plugin: "your.plugin.id")
Обратите внимание, как путь к классам сделан из группы, определенной в файле Gradle плагина, и имя его каталога.