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

时间:2019-03-23 14:26:33

标签: java gradle groovy kotlin build-script

简介

该项目位于科特林中,并使用 Gradle 构建。我正在尝试使用一些构建信息生成基本数据类,现在让我们说,我需要每次运行前都重新生成它。

这是我现在拥有的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"

问题

当我在此模块上首次运行assemble时,运行clean后,似乎生成器代码仅执行一次。这不是我想要的,因为当我更改某些项目属性(如version)时,源不会得到更新……就好像compileJava / compileKotlin和我的自定义任务未执行。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

您还可以配置它以将所有构建/运行任务委托给Gradle。但这不是默认设置。