Подтвердить что ты не робот

Добавление локального плагина в проект Gradle

У меня есть плагин Gradle, который компилируется и работает так, как ожидалось. Я хотел бы распространить с исходным кодом пример приложения с помощью плагина Gradle, который также позволит мне легко протестировать изменения в плагине. Теперь для этого я должен добавить зависимость класса к блоку buildScript. Можно ли добавить зависимый локальный плагин, который будет скомпилирован с примером проекта? Основная проблема, с которой я сейчас сталкиваюсь, заключается в том, что плагин не существует при попытке синхронизации проекта примера, приводящего к сбою.

4b9b3361

Ответ 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 плагина, и имя его каталога.