Таким образом, приведенный выше ответ не является слишком длинным, и для сохранения проблем, с которыми я столкнулся, я публикую новый ответ.
PLUGIN
Эта частьОтвет будет обсуждать фактический проект пользовательского плагина. Поскольку оболочка плагинов в build.gradle.kts является средой выполнения, CustomPlugin.kt не имеет доступа к ней во время компиляции. Мой босс, который намного умнее меня, был достаточно любезен, чтобы указать мне на это, хотя он никогда не работал с gradle. Несмотря на то, что я выглядел довольно глупо перед ним, он все же заставил меня начать работать, в основном следуя «старому» способу применения плагинов в Gradle.
plugins { // This is a runtime script preventing plugins declared here to be accessible in CustomPlugin.kt but is used to actually publish/release this plugin itself
id("net.researchgate.release") version "2.8.1"
kotlin("jvm") version "1.3.0"
`maven-publish`
}
repositories {
maven { url = uri("https://plugins.gradle.org/m2/") } // This is required to be able to import plugins below in the dependencies
jcenter()
}
dependencies {
compile(kotlin("stdlib"))
compile(kotlin("reflect"))
// These must be declared here (at compile-time) in order to access in CustomPlugin.kt
compile(group = "gradle.plugin.com.gorylenko.gradle-git-properties", name = "gradle-git-properties", version = "2.2.0")
compile(group = "gradle.plugin.com.google.cloud.tools", name = "jib-gradle-plugin", version = "1.7.0")
compile(group = "net.researchgate", name = "gradle-release", version = "2.8.1")
compile(group = "org.asciidoctor", name = "asciidoctor-gradle-plugin", version = "1.5.9.2")
compile(group = "org.jetbrains.dokka", name = "dokka-gradle-plugin", version = "0.9.18")
compile(group = "org.sonarsource.scanner.gradle", name = "sonarqube-gradle-plugin", version = "2.8")
implementation(gradleApi()) // This exposes the gradle API to CustomPlugin.kt
}
Это позволило мне иметь доступ к Jib и всему остальномув CustomPlugin.kt . Плагины jacoco и maven-publish автоматически доступны в проекте плагина, но все еще должны быть добавлены в проект микросервиса со ссылкой на плагин. К сожалению, я не смог найти обходной путь для этого.
Я включил типичный плагин maven-publish в build.gradle.kts , чтобы перейти на нексус с конфигурациями задач публикации в build.gradle.kts , чтобы я мог извлечь это из нексуса в микросервисе, который хотел использовать плагин.
publishing {
publications {
create<MavenPublication>(project.name) {
from(components["java"])
pom {
scm {
connection.set("scm:git:git@github.com:diendanyoi54/${project.name}.git")
developerConnection .set("scm:git:git@github.com:diendanyoi54/${project.name}.git")
url.set("https://github.com/diendanyoi54/${project.name}/")
}
}
}
}
repositories {
maven {
val baseUrl = "https://${project.properties["nexus.host"].toString()}:${project.properties["nexus.port.jar"].toString()}/repository"
url = uri(if (version.toString().endsWith("SNAPSHOT")) "$baseUrl/maven-snapshots" else "$baseUrl/maven-releases")
credentials {
username = project.properties["nexus.user"].toString()
password = project.properties["nexus.password"].toString()
}
}
}
}
Наконец, вы хотите убедиться, что вы включили файл свойствэто скажет микросервисам, где находится класс плагина. В IDEA Intellij при вводе пути к классу реализации он автоматически заполняется для меня. Имя этого файла должно отражать apply (plugin = "string") в build.gradle.kts микросервиса .
РЕАЛИЗАЦИЯ
Эта часть ответа будет отражать проект микросервиса, который будет ссылаться на плагин. Как указывалось выше, jacoco и maven-publish все еще необходимо добавить в блок плагинов в build.gradle.kts по какой-то причине (я думаю, потому что они являются официальными плагинами gradle).
Чтобы ссылаться на плагин с сервера nexus, на котором он был опубликован, микросервис должен ссылаться на него в сценарии сборки.
buildscript { // Custom plugin must be accessed by this buildscript
repositories {
maven {
url = uri("https://${project.properties["nexus.host"].toString()}:${project.properties["nexus.port.jar"].toString()}/repository/maven-public")
credentials {
username = project.properties["nexus.user"].toString()
password = project.properties["nexus.password"].toString()
}
}
}
dependencies { classpath("com.company:kotlin-consolidated-plugin:1.0.0-SNAPSHOT") }
}
Наконец, плагиннеобходимо применить, используя имя файла свойств, указанное выше.
apply(plugin = "com.company.kotlinconsolidatedplugin") // Custom plugin cannot reside in plugin declaration above
Я создал образцы проектов и разместил их на Github, поэтому не стесняйтесь клонировать или просматривать: git@github.com:diendanyoi54 / kotlin-consolidated-plugin.git
git@github.com: diendanyoi54 / kotlin-consolidated-plugin-реализация.git