Применить локальный jar-плагин без использования maven
Я хочу загрузить свой собственный плагин из локального файла .
jar
файл компилируется нормально, и когда я его проверяю, манифест и класс плагина есть.
gradlePlugin {
plugins {
create("asdf") { // <-- I really call it "asdf" in the kts script
id = "asdf"
implementationClass = "pluginTest.TestPlugin"
version = "1.4.0"
}
}
}
Плагин пока не делает ничего полезного, так как он должен быть проверкой концепции, чтобы убедиться, что он вообще работает:
class TestPlugin : Plugin<Project> {
override fun apply(project: Project) {
println("Hallo TestPlugin!")
}
}
Затем я пытаюсь использовать его так в другом проекте:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath(files("..\\..\\path\\to\\pluginTest.jar"))
}
}
plugins {
id("asdf") version "1.4.0"
}
но он продолжает говорить мне, что:
Плагин [id: 'asdf', версия: '1.4.0'] не найден ни в одном из следующих источников:
Что мне здесь не хватает? Я использую Gradle v6.5.
2 ответа
С ответом @BjørnVester я понял это!
Вам нужно поставить
buildscript
в
settings.gradle.kts
так как он не выполняется даже при размещении перед
plugins
.
buildscript {
repositories {
flatDir {
dirs("..\\reusable-kotlin\\build\\libs") // <-- folder with jars
}
}
dependencies {
classpath("com.hedev.kotlin:reusable-kotlin:1.4.0")
}
}
Но есть загвоздка! Вы должны использовать имя файла
jar
в
classpath
идентификатор имени, который выглядит следующим образом:
группа:имя-файла:версия
Файл, который будет искать gradle, будет
file-name-version.jar
или же
file-name.jar
которое вы увидите в сообщении об ошибке, если допустите ошибку (я добавил
_
намеренно вызвать ошибку):
Не удалось разрешить все артефакты для конфигурации «путь к классам».
Не удалось найти com.hedev.kotlin:reusable-kotlin_:1.4.0. Искал в следующих местах:
- файл:/C:/some/path/reusable-kotlin/build/libs/reusable-kotlin_-1.4.0.jar
- file:/C:/some/path/reusable-kotlin/build/libs/reusable-kotlin_.jar
Чтобы это работало, мне также пришлось добавить
group
свойство самого плагина:
gradlePlugin {
plugins {
create("asdf") {
id = "asdf"
implementationClass = "com.hedev.kotlin.gradle.TestPlugin"
version = "1.4.0"
group = "com.hedev.kotlin"
}
}
}
Наконец, вы можете применить его в
build.gradle.kts
с (здесь нет версии):
plugins {
id("asdf")
}
Когда у вас есть jar-файл плагина в пути к классам, у вас не может быть номера версии в приложении плагина. Я предполагаю, что это связано с тем, что вы не можете иметь несколько jar-файлов с разными версиями в пути к классам, поэтому указание версии здесь не имеет никакого смысла (за исключением, возможно, подтверждения того, что вы используете правильный). Это не решит проблему, но это начало.
Честно говоря, я не знаю, почему ваш подход все еще не работает. Предполагается, что блок buildscript устанавливает зависимости для этого конкретного скрипта, и это должно сделать плагин видимым для него. Это не так по какой-то причине.
Возможно, это ошибка, а возможно, это просто недокументированное ограничение на использование блока plugin {}. Возможно, вы могли бы задать вопрос на форумах Gradle или создать для него проблему . Однако есть обходные пути, не связанные с публикацией в (локальный) репозиторий Maven, что, я согласен, может немного раздражать.
Если вы используете «применить от» вместо «плагины {}», это сработает. По какой-то причине первый может видеть путь к классу buildscript, тогда как последний не может:
// build.gradle (Groovy DSL)
buildscript {
dependencies {
classpath(files("..\\..\\path\\to\\pluginTest.jar"))
}
}
apply from: "asdf"
Либо переместите подключаемый модуль buildscript из файла build.gradle в файл settings.gradle. Это делает доступным весь путь к классам сборки и заставит его работать с блоком плагинов:
// settings.gradle (Groovy DSL):
buildscript {
dependencies {
classpath(files("..\\..\\path\\to\\pluginTest.jar"))
}
}
// build.gradle (Groovy DSL)
plugins {
id("asdf")
}
Наконец, на случай, если вы еще не подумали об этом, вы можете добавить плагин как составную сборку . Это создаст исходную зависимость от плагина и имеет то преимущество, что транзитивные зависимости будут перенесены (те, которые вы поместили в собственный блок зависимостей плагина) и что он будет создан автоматически, если он не обновлен. Я использую этот подход для интеграционного тестирования своих плагинов, а также иногда применяю их к другим моим реальным проектам, чтобы протестировать их в больших условиях перед публикацией новых версий.
Сделайте это либо с помощью:
// settings.gradle (Groovy DSL):
includeBuild("..\\..\\path\\to\\plugin")
// build.gradle (Groovy DSL):
plugins {
id("asdf")
}
Или без жесткого кодирования в сборке (чтобы вы могли динамически переключаться между локальной и опубликованной версиями):
// build.gradle (Groovy DSL):
plugins {
id("asdf") version "1.4.0" // Version is optional (will be ignored when the command line switch below)
}
// Run with:
./gradlew --include-build "..\\..\\path\\to\\plugin" build