kotlin - 如何使用 Gradle Kotlin buildSrc 插件自定义 KotlinCompile 任务?

标签 kotlin gradle

我正在尝试简化我的一些 Gradle 构建。典型的 build.gradle.kts 看起来像

plugins {
    base
    idea
    java
    id("biz.aQute.bnd.builder")
    kotlin("jvm")
    id("org.jetbrains.dokka")
}

dependencies {
    implementation(kotlin("stdlib-jdk8"))
    implementation("org.osgi:osgi.annotation:7.0.0")
    implementation("org.osgi:osgi.cmpn:7.0.0")
    implementation("org.osgi:osgi.core:7.0.0")
    testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0")
    testImplementation("org.junit.jupiter:junit-jupiter-api:5.4.2")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.4.2")
}

tasks.compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
        useIR = true
    }
}

tasks.compileTestKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
        useIR = true
    }
}

version = "0.0.0"

java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

tasks.jar {
    archiveBaseName.set("project.name.api")
}

tasks.named<Test>("test") {
    useJUnitPlatform()
}

我正在尝试减少重复,特别是使用 tasks.compileKotlintasks.compileTestKotlin block 。

我读到应该使用 buildSrc 文件夹来定义这样的简化。文件夹结构为

buildSrc/
  src/
    main/
      kotlin/
        Example.kt
  build.gradle.kts

示例.kt

import org.gradle.kotlin.dsl.KotlinBuildScript
import org.gradle.kotlin.dsl.dependencies
import org.gradle.kotlin.dsl.kotlin
//import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

fun KotlinBuildScript.configureModule() {
    tasks.named<KotlinCompile>("compileKotlin") {
        kotlinOptions {
            jvmTarget = "1.8"
            useIR = true
        }
    }
}

buildSrc/build.gradle.kts

plugins {
    `kotlin-dsl`
}

repositories {
    mavenCentral()
}

但这种设置只会在构建过程中导致 Unresolved reference: kotlin 错误。

我不知道需要在哪里更改才能成功引用 KotlinCompile 类。我尝试指定 kotlin 插件、idea 插件,并尝试在 buildSrc/build.gradle.kts 中添加对 kotlin 的依赖项,但我无法在 github 或 google 上找到任何关于如何操作的示例进行设置。

我也想对大多数构建脚本执行相同的操作,而不仅仅是 KotlinCompile 任务,因此,如果我能提供有关我应该搜索什么或如何搜索这些其他任务类型的任何指导,我们将不胜感激。

最佳答案

看起来您正在 KotlinBuildScript 上创建扩展函数,这可能是也可能不是问题。无论如何,不​​需要扩展功能,直接使用 DSL 即可。

Gradle 调用共享构建逻辑约定插件:https://docs.gradle.org/current/samples/sample_convention_plugins.html#compiling_convention_plugins

因此您的 Example.kt 将变为 kotlin-conventions.gradle.kts:

// kotlin-conventions.gradle.kts

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin
}

tasks {
    compileKotlin {
        kotlinOptions {
            jvmTarget = "1.8"
            useIR = true
        }
    }
}

然后在主 Gradle 构建文件中,应用约定插件:

// build.gradle.kts

plugins {
    `kotlin-conventions`
}

关于kotlin - 如何使用 Gradle Kotlin buildSrc 插件自定义 KotlinCompile 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66450310/

相关文章:

kotlin - PeriodicWorkRequest 不重复

generics - Kotlin:是否可以拥有依赖于实现泛型类型的常量属性?

gradle - 自定义Gradle插件-插件之间共享数据

android - PhoneGap Build - 无法为 org.gradle 类型的对象获取未知属性 'GMS_VERSION'

android - Gradle 依赖项 : Get latest snapshot from remote repo

Android Studio 3.0 gradle 3.0.0-beta2,打破 Kotlin 单元测试覆盖率?

kotlin - 在 Kotlin 中创建私有(private)内部类的公共(public)实例

gradle - Intellij 和 gradle 依赖问题

android - 无法解决 : com. github.PhilJay :MPAndroidChart:v2. 1.4

gradle - jacocoRootReport仅显示多项目gradle构建的最后一个项目的覆盖范围