Gradle 任务未按要求 运行(编译前)

Gradle task not running as demanded (before compiling)

简介

该项目使用 Kotlin 并使用 Gradle 构建。我正在尝试使用一些构建信息生成基本数据 class,现在假设我需要在 运行ning.

之前每次都[重新]生成它

这是我现在的 Gradle 任务:

def generatedDir = "$buildDir/generated"

// noinspection GroovyAssignabilityCheck
task generateBuildInfo {
    inputs.property "version", rootProject.version.toString()
    inputs.property "name", rootProject.name.toString()

    outputs.dir generatedDir
    outputs.upToDateWhen { false }

    doFirst {
        def buildInfoFile = file("$generatedDir/BuildInfo.kt")
        buildInfoFile.parentFile.mkdirs()
        buildInfoFile.text = """
        internal data class BuildInfo(
          val version: String = "${project.version.toString() ?: "unspecified"}",
          val name: String = "${project.name.toString() ?: "unspecified"}"
        )
        """.replace("        ", "").trim()
    }
}

为了能够从 IntelliJ IDEA 解决这个问题,我将我的新文件夹添加到项目源中,显然连接了依赖项,如下所示:

sourceSets.main.kotlin.srcDirs += generatedDir

project.afterEvaluate {
    compileJava.dependsOn generateBuildInfo
    compileKotlin.dependsOn generateBuildInfo
}

这一切都在一个单独的文件中完成(以避免污染我的主要脚本)。由于这个组织,在应用插件后,我只在我的主脚本中包含生成器,如下所示:

apply from: "gradle/scripts/build-info-generator.gradle"

问题

看起来生成器代码只执行了一次,在 运行ning assemble 之后我第一次 运行 clean 在这个模块上。这不是我想要的,因为当我更改某些项目属性(如 version)时,源代码不会更新...就像 compileJava/compileKotlin 和我的自定义任务不执行。

它们不会在执行时出现在构建日志中。

每次我想 运行 我的模块启动器时,有什么方法可以 运行 这个任务吗?当然,我可以做一些智能文件比较,看看是否需要生成,但现在我只想每次都完成。我错过了什么吗?

IDEA 有自己的构建系统,独立于 Gradle。

您可以将其配置为 运行 在其自己的构建任务之前执行 Gradle 任务。

您还可以将其配置为将所有 build/run 任务委派给 Gradle。但这不是默认设置。