Как заставить android-app-module идентифицировать и использовать источники gradle-plugin-module - PullRequest
4 голосов
/ 21 октября 2019

Я создал отдельный плагин вместе с простым демонстрационным приложением, которое мне нужно для разработки. Оба добавляются в один и тот же проект в виде app -модуля и plugin -модуля, так что я могу легко разрабатывать и тестировать функции, которые я пишу в плагине. Я предполагаю, что если я добавлю источники из плагина в buildSrc/build.gradle.kts, я смогу ссылаться на источники плагина из приложения (мне нужно это, чтобы создать и применить плагин). Демонстрационный проект в полном объеме можно найти здесь: https://github.com/oizo/gradle-plugin-sample.

В настоящее время кажется, что когда я применяю плагин в app/build.gradle.kts, он становится доступным (автозаполнение работает), но когда я пытаюсь собрать с ./gradlew build с этим сообщением не получается:

FAILURE: Build failed with an exception.

* Where:
Build file '/Users/MyUser/github/gradle-plugin-sample/app/build.gradle.kts' line: 10

* What went wrong:
Script compilation error:

  Line 10: apply<io.hvam.android.plugin.StringPlugin>()
                 ^ Unresolved reference: io

Очевидно, я что-то упустил.

Я пробовал решение, предложенное в этом посте - https://stackoverflow.com/a/42263532/1181023,, которое, кажется,быть похожей проблемой, но когда я запускаю ./gradlew build --include-build plugin/, он также не может быть собран, со следующим:

FAILURE: Build failed with an exception.

* What went wrong:
Included build in /Users/MyUser/github/gradle-plugin-sample/plugin has a root project whose name 'plugin' is the same as a project of the main build.

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Кажется, я неправильно понял, как gradle использует папку buildSrc. Я переместил содержимое buildscript в buildSrc/build.gradle.kts, но пропустил фактическое расширение buildscript. Это каким-то образом исправило проблему с модулем app, который не мог распознавать источники plugin при сборке. Конкретные изменения, связанные с исправлением, можно просмотреть в this commit . И пример кода в репозитории теперь создается, как и ожидалось.

Это дает больше ясности относительно назначения папки buildSrc: https://stackoverflow.com/a/13875350/1181023

0 голосов
/ 22 октября 2019

Я вижу две проблемы:

  • Ваш плагин должен быть упакован таким образом, чтобы ваш реализующий класс Plugin был виден потребителям плагина в качестве точки входа. Один из простых способов сделать это - использовать блок gradlePlugin {}. Я бы рекомендовал обновить хотя бы до Gradle 5.5.1 и использовать плагин build init для автоматизации всего этого для вас.

    Пожалуйста, попробуйте gradle init --type kotlin-gradle-plugin, чтобы сгенерировать проект плагина. Это добавит код, подобный приведенному ниже, в ваш плагин build.gradle, который гарантирует, что ваши потребители могут применить плагин, используя apply plugin: "stringPlugin".

gradlePlugin {
   plugins {
     stringPlugin {
         id = "stringPlugin"
         implementationClass = "com.example.StringPlugin"
     }
   }
}
  • Во-вторых, ваш плагин должен бытьвидимый путь к классу buildscript, чтобы он мог применить ваш плагин. Если вы уже опубликовали плагин для maven, вы можете добавить нижеприведенное на уровне проекта build.gradle, чтобы позволить gradle обнаружить ваш плагин.
buildscript {
    ...
    dependencies {
       classpath "com.example:stringplugin"
    }
}

Публикация в maven может быть не удобной во время разработки,Вы могли бы использовать составные сборки Gradle , чтобы помочь в этом отношении. На уровне вашего проекта settings.gradle добавьте ниже:

includeBuild('./plugin') {
    dependencySubstitution {
        substitute module('com.example:stringplugin') with project(':plugin')
    }
}

Это указывает Gradle на использование локально присутствующего модуля :plugin, когда запрашивается com.example:stringplugin. Это было бы удобно для разработки.

...