如何使用Kotlin将导入的插件整合到Gradle中的自定义插件

如何使用Kotlin将导入的插件整合到Gradle中的自定义插件,gradle,kotlin,nexus,gradle-plugin,gradle-kotlin-dsl,Gradle,Kotlin,Nexus,Gradle Plugin,Gradle Kotlin Dsl,我有一些微服务,它们之间共享一些相同的配置,主要是Jib、publish和release。不确定是否可以对依赖项执行相同的操作,但在每个依赖项中包含执行器和log4j2将是有益的。这是我的一个项目的build.gradle.kts import net.researchgate.release.BaseScmAdapter import net.researchgate.release.GitAdapter import net.researchgate.release.ReleaseExten

我有一些微服务,它们之间共享一些相同的配置,主要是Jib、publish和release。不确定是否可以对依赖项执行相同的操作,但在每个依赖项中包含执行器和log4j2将是有益的。这是我的一个项目的build.gradle.kts

import net.researchgate.release.BaseScmAdapter
import net.researchgate.release.GitAdapter
import net.researchgate.release.ReleaseExtension
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("com.gorylenko.gradle-git-properties") version "1.5.1"
    id("com.google.cloud.tools.jib") version "1.6.1"
    id("io.spring.dependency-management") version "1.0.7.RELEASE"
    id("net.researchgate.release") version "2.8.1"
    id("org.sonarqube") version "2.7.1"
    id("org.springframework.boot") version "2.1.6.RELEASE"
    kotlin("jvm") version "1.2.71"
    kotlin("plugin.spring") version "1.2.71"
    jacoco
    `maven-publish`
}

java.sourceCompatibility = JavaVersion.VERSION_1_8

springBoot {
    buildInfo {
        group = project.properties["group"].toString()
        version = project.properties["version"].toString()
        description = project.properties["description"].toString()
    }
}

repositories {
    maven(url = uri(project.properties["nexus.url.gateway"].toString()))
    mavenCentral()
}

dependencies {
    // Kotlin
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")

    // Spring
    implementation("org.springframework.boot:spring-boot-starter-actuator")
    implementation("org.springframework.boot:spring-boot-starter-log4j2")
    implementation("org.springframework.boot:spring-boot-starter-security")
    implementation("org.springframework.cloud:spring-cloud-config-server")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

dependencyManagement {
    imports {
        mavenBom("org.springframework.cloud:spring-cloud-dependencies:Greenwich.SR3")
    }
}

configurations.all {
    exclude(group = "ch.qos.logback", module = "logback-classic")
    exclude(group = "org.springframework.boot", module = "spring-boot-starter-logging")
}

tasks {
    withType<KotlinCompile> {
        kotlinOptions {
            freeCompilerArgs = listOf("-Xjsr305=strict")
            jvmTarget = "1.8"
        }
    }

    build { dependsOn(clean) }
    afterReleaseBuild { dependsOn(publish) }
    publish { dependsOn(build) }
    jibDockerBuild { dependsOn(build) }
    jacocoTestReport {
        reports {
            html.isEnabled = false
            xml.isEnabled = true
        }
    }
}

publishing {
    publications {
        create<MavenPublication>(project.name) {
            from(components["java"])
            pom {
                scm {
                    connection.set("scm:git:git@github.com:company/${project.name}.git")
                    developerConnection.set("scm:git:git@github.com:company/${project.name}.git")
                    url.set("https://github.com/company/${project.name}/")
                }
            }
            versionMapping {
                usage("java-api") {
                    fromResolutionOf("runtimeClasspath")
                }
                usage("java-runtime") {
                    fromResolutionResult()
                }
            }
        }
    }
    repositories {
        maven {
            val releasesRepoUrl = "${project.properties["nexus.url.publish"].toString()}/releases"
            val snapshotsRepoUrl = "${project.properties["nexus.url.publish"].toString()}/snapshots"
            url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else releasesRepoUrl)
            credentials {
                username = project.properties["nexus.user"].toString()
                password = project.properties["nexus.password"].toString()
            }
        }
    }
}

fun ReleaseExtension.git(configureFn : GitAdapter.GitConfig.() -> Unit) {
    (propertyMissing("git") as GitAdapter.GitConfig).configureFn()
}

release {
    scmAdapters = mutableListOf<Class<out BaseScmAdapter>> ( GitAdapter::class.java )

    git {
        requireBranch = "develop"
        pushToRemote = project.properties["release.git.remote"].toString()
        pushReleaseVersionBranch = "master"
        tagTemplate = "${project.name}.${project.version}"
    }
}

jib {
    from {
        image = "openjdk:8-jdk-alpine"
    }
    to {
        image = "host:port/${project.name}:${project.version}"
        auth {
            username = project.properties["nexus.user"].toString()
            password = project.properties["nexus.password"].toString()
        }
    }
    container {
        workingDirectory = "/"
        ports = listOf("8080")
        environment = mapOf(
                "SPRING_OUTPUT_ANSI_ENABLED" to "ALWAYS",
                "SPRING_CLOUD_BOOTSTRAP_LOCATION" to "/path/to/bootstrap.yml"
        )
        useCurrentTimestamp = true
    }
    setAllowInsecureRegistries(true)
}
import net.researchgate.release.BaseScmAdapter
导入net.researchgate.release.GitAdapter
导入net.researchgate.release.ReleaseExtension
导入org.jetbrains.kotlin.gradle.tasks.KotlinCompile
插件{
id(“com.gorylenko.gradle git properties”)版本“1.5.1”
id(“com.google.cloud.tools.jib”)版本“1.6.1”
id(“io.spring.dependency management”)版本“1.0.7.RELEASE”
id(“net.researchgate.release”)版本“2.8.1”
id(“org.sonarqube”)版本“2.7.1”
id(“org.springframework.boot”)版本“2.1.6.RELEASE”
kotlin(“jvm”)版本“1.2.71”
kotlin(“plugin.spring”)版本“1.2.71”
杰科科
`马文出版社`
}
java.sourceCompatibility=JavaVersion.VERSION\u 1\u 8
弹簧靴{
建筑信息{
group=project.properties[“group”].toString()
version=project.properties[“version”].toString()
description=project.properties[“description”].toString()
}
}
存储库{
maven(url=uri(project.properties[“nexus.url.gateway”].toString())
mavenCentral()
}
依赖关系{
//科特林
实施(“org.jetbrains.kotlin:kotlin reflect”)
实现(“org.jetbrains.kotlin:kotlin-stdlib-jdk8”)
//弹簧
实现(“org.springframework.boot:springbootstarteractivator”)
实现(“org.springframework.boot:spring-boot-starter-log4j2”)
实现(“org.springframework.boot:springbootstartersecurity”)
实现(“org.springframework.cloud:springcloud配置服务器”)
测试实现(“org.springframework.boot:springbootstarter测试”)
}
依赖管理{
进口{
mavenBom(“org.springframework.cloud:springcloud依赖项:Greenwich.SR3”)
}
}
配置。全部{
排除(group=“ch.qos.logback”,module=“logback classic”)
排除(group=“org.springframework.boot”,module=“springbootstarterlogging”)
}
任务{
withType{
科特洛普斯酒店{
freeCompilerArgs=listOf(“-Xjsr305=strict”)
jvmTarget=“1.8”
}
}
构建{dependsOn(clean)}
afterReleaseBuild{dependsOn(publish)}
发布{dependsOn(build)}
jibDockerBuild{dependsOn(build)}
jacocoTestReport{
报告{
html.isEnabled=false
xml.isEnabled=true
}
}
}
出版{
出版物{
创建(project.name){
来自(组件[“java”])
聚甲醛{
供应链管理{
connection.set(“scm:git:git@github.com:company/${project.name}.git”)
developerConnection.set(“scm:git:git@github.com:company/${project.name}.git”)
url.set(“https://github.com/company/${project.name}/”)
}
}
版本映射{
用法(“java api”){
fromResolutionOf(“运行时类路径”)
}
用法(“java运行时”){
fromResolutionResult()
}
}
}
}
存储库{
马文{
val releasesRepoUrl=“${project.properties[“nexus.url.publish”].toString()}/releases”
val snapshotsRepoUrl=“${project.properties[“nexus.url.publish”].toString()}/snapshots”
url=uri(如果(version.toString().endsWith(“快照”))快照报告,否则发布报告)
证书{
username=project.properties[“nexus.user”].toString()
password=project.properties[“nexus.password”].toString()
}
}
}
}
fun ReleaseExtension.git(configureFn:GitAdapter.GitConfig.(->Unit){
(propertyMissing(“git”)作为GitAdapter.GitConfig.configureFn()
}
释放{
scmAdapters=mutableListOf(GitAdapter::class.java)
吉特{
requireBranch=“开发”
pushToRemote=project.properties[“release.git.remote”].toString()
pushReleaseVersionBranch=“master”
tagTemplate=“${project.name}.${project.version}”
}
}
三角帆{
从{
image=“openjdk:8-jdk-alpine”
}
到{
image=“主机:端口/${project.name}:${project.version}”
认证{
username=project.properties[“nexus.user”].toString()
password=project.properties[“nexus.password”].toString()
}
}
容器{
workingDirectory=“/”
端口=listOf(“8080”)
环境=地图(
“弹簧输出已启用”改为“始终”,
“SPRING\u CLOUD\u BOOTSTRAP\u LOCATION”到“/path/to/BOOTSTRAP.yml”
)
useCurrentTimestamp=true
}
setAllowInsecureRegistries(真)
}

我能够得到一个自定义插件创建和添加到这个项目使用和,但我不知道如何实现这些现有的插件及其配置。在应用函数的主插件类中,我可以调用project.pluginManager.apply(PublishingPlugin::class.java),这会导致任务显示在项目中,引用自定义插件,但我不知道如何配置它,并且它没有成功发布到nexus服务器。我可以将插件本身发布到nexus服务器,并在microservice中引用它,但它会跳过运行该任务,我认为这是由于未包含配置造成的。此外,当尝试应用/配置Jib插件时,所有类在尝试导入时都不可见。

应用内置插件

plugins {
java
id("jacoco")
}
plugins {
    id("org.springframework.boot") version "2.0.1.RELEASE"
}
也可以使用较旧的应用语法:

apply(plugin = "checkstyle")
应用外部插件

plugins {
java
id("jacoco")
}
plugins {
    id("org.springframework.boot") version "2.0.1.RELEASE"
}
我不擅长科特林,但这里是链接到b
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
}
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()
            }
        }
    }
}
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