Применить локальный 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
Другие вопросы по тегам