Применить локальный jar-плагин без использования maven

Я хочу загрузить свой собственный плагин с локального jar. Файл 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.


person t3chb0t    schedule 11.01.2021    source источник
comment
Может быть, для разделов репозиториев требуется flatDir репозиторий? Я не привык иметь дело с локальными файлами, но думаю, это может быть похоже на stackoverflow.com/questions/20700053/   -  person Joffrey    schedule 11.01.2021
comment
Другой вариант может заключаться в том, что блок plugins {} с версионным плагином не работает с такими простыми файлами, как этот. Вместо этого, может быть, вы можете просто apply<TestPlugin>() вместо всего plugins блока? Они делают это так, как описано в начале этого руководства: docs.gradle. org / current / userguide /   -  person Joffrey    schedule 11.01.2021
comment
@Joffrey Я попробовал оба предложения. К сожалению, Gradle их не купила. Думаю, мне все-таки придется настроить локальный maven :-( а, это так расстраивает.   -  person t3chb0t    schedule 11.01.2021
comment
@Joffrey, возможно, вы захотите увидеть мой ответ; -] можно использовать jar-файлы.   -  person t3chb0t    schedule 11.01.2021


Ответы (2)


Когда у вас есть jar-файл плагина в пути к классам, у вас не может быть номера версии в приложении плагина. Я предполагаю, что это связано с тем, что у вас не может быть несколько банок с разными версиями в пути к классам, поэтому указывать версию здесь не имеет никакого смысла (за исключением, возможно, проверки того, что вы используете правильный). Это не решит проблему, но это только начало.

Если честно, я не знаю, почему ваш подход до сих пор не работает. Блок buildscript должен устанавливать зависимости для этого конкретного скрипта, и это должно сделать плагин видимым для него. По какой-то причине это не так.

Возможно, это ошибка или это просто недокументированное ограничение на использование блока plugin {}. Возможно, вы могли бы спросить на форумах Gradle или создать проблема для этого. Однако есть обходные пути, которые не связаны с публикацией в (локальном) репозитории Maven, что, я согласен, может немного раздражать.

Если вы используете apply from вместо plugins {}, это работает. По какой-то причине первый может видеть путь к классам 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
person Bjørn Vester    schedule 11.01.2021
comment
Очень информативно, спасибо за столько идей! Наконец-то я начал работать с apply(plugin="asdf") (Kotlin DSL). По умолчанию с from это не сработало. Я передвинул buildscript, но безуспешно, поэтому вставил его обратно в build.gradle.kts и начал экспериментировать с apply. Затем я перескочил к источнику и увидел, что у него более одного аргумента, я попробовал и бац! :) - person t3chb0t; 11.01.2021
comment
Мне было интересно узнать разницу между двумя методами, и этот ответ довольно хорошо объясняет это: Какая разница в применении плагина gradle Gradle пока не переместил функциональность на новый api. - person t3chb0t; 11.01.2021
comment
Невероятно, см. Мой ответ, я нашел способ :-) - person t3chb0t; 11.01.2021

С ответом @ BjørnVester я понял это!

Вам нужно поместить buildscript в settings.gradle.kts, поскольку он не выполняется в build.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
- файл: / 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")
}
person t3chb0t    schedule 11.01.2021