如何使用Kotlin将导入的插件整合到Gradle中的自定义插件
我有一些微服务,它们之间共享一些相同的配置,主要是Jib、publish和release。不确定是否可以对依赖项执行相同的操作,但在每个依赖项中包含执行器和log4j2将是有益的。这是我的一个项目的build.gradle.kts如何使用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
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