Gradle: используйте дочерний подпроект в качестве плагина - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть проект с двумя подпроектами: gradle-plugin и plugin-consumer. Я хочу применить плагин от gradle-plugin до plugin-consumer. Я пытался сделать это:

// plugin-consumer/build.gradle

buildscript {
    dependencies {
        classpath project(':gradle-plugin')
    }
}

apply plugin: 'my.plugin.id'

Но меня приветствовала следующая ошибка:

A problem occurred configuring project ':plugin-consumer'.
> Cannot use project dependencies in a script classpath definition.

Я предполагаю, что это не поддерживается, потому что для этого потребуется полная сборка gradle-plugin до plugin-consumer можно настроить.

К счастью, я могу использовать fileTree зависимость для достижения sh моей цели:

// plugin-consumer/build.gradle

buildscript {
    dependencies {
        classpath fileTree(includes: ['*.jar'], dir: '../gradle-plugin/build/libs')
    }
}

apply plugin: 'my.plugin.id'

Это работает, но похоже на массивный взлом и приводит к "начальной загрузке" проблемы ".

Например, я не могу clean gradle-plugin, потому что (удаленный) файл jar необходим для настройки plugin-consumer, что необходимо для (пере) сборки gradle-plugin. К счастью, этого можно избежать, если всегда запускать build сразу после clean (в том же «запуске», так сказать). Это можно сделать вручную (gradle clean build) или автоматически (с clean.finalizedBy(build)). Опять же, это работает , но похоже на хак.

Наконец, мой актуальный вопрос: есть ли лучший способ сделать это?

Обратите внимание что gradle-plugin является независимым плагином, который используется не только plugin-consumer, поэтому buildSrc, к сожалению, не является подходящим решением.

1 Ответ

1 голос
/ 18 апреля 2020

Вы можете опубликовать sh плагин в своем локальном репозитории Maven с помощью плагина Maven Publi sh. Затем просто используйте его, как любой другой артефакт.

Предположим, у вас есть что-то похожее в вашем проекте плагина:

plugins {
    `maven-publish`
    `java-gradle-plugin`
}

Просто опубликуйте sh локально:

./gradlew :my-plugin-project:publishToMavenLocal

Тогда в вашем потребляющем проекте, что-то вроде:

buildscript {
    repositories {
        mavenLocal()
    }
    dependencies {
        "classpath"("com.example:my-plugin-gav:1.0.0-SNAPSHOT")
    }
}

// apply plugin
...