【问题标题】:Gradle task is never up-to-dateGradle 任务永远不会是最新的
【发布时间】:2016-01-14 09:33:37
【问题描述】:

在任务的配置阶段,我将一些目录注册为builtBy: thisTask。我希望 gradle 能够自动检测源是否已更改,但任务始终在执行。
这是任务:

subprojects {

    def srcMainMirah = file('src/main/mirah')
    if (srcMainMirah.exists()) {

        idea.module.sourceDirs += srcMainMirah

        task compileMirah {

            def classesMirahMain = file("$buildDir/classes-mirah/main")

            inputs.sourceDir srcMainMirah
            def thisTask = delegate
            sourceSets.main {
                output.dir(classesMirahMain, builtBy: thisTask)
                java.srcDir srcMainMirah
            }
            dependsOn tasks.compileJava

            doFirst {
                def classpath = files("$buildDir/classes/main").plus(configurations.compile)
                mirahc(srcMainMirah, classesMirahMain, classpath)
            }
        }
    }
}

它用于编译mirah语言的源代码,生成*.class文件,就像java编译器一样。

【问题讨论】:

    标签: groovy gradle build mirah


    【解决方案1】:

    仅声明任务的输入不足以确定任务是否是最新的。您还需要声明 task.outputs

    没有定义输出的任务将永远被认为是最新的。对于任务的输出不是文件的场景,或者对于更复杂的场景,TaskOutputs.upToDateWhen() 方法允许您以编程方式计算任务输出是否应该被认为是最新的。

    如果这些输出自上一次构建以来未发生变化,则仅定义了输出的任务将被视为最新的。

    来自section 17.9.1 here

    【讨论】:

    • output.dir(classesMirahMain, builtBy: thisTask) 应该将classesMirahMain dir 注册为thisTask 的输出不是吗?
    • 输出目录被自动识别为仅用于Copy类型任务的输出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多