gradle - 如果有什么不是最新的,如何询问 gradle

标签 gradle

有没有办法询问 gradle 是否有任何东西不是最新的并且需要构建(然后不实际构建它)?

最佳答案

这不可能。最新检查发生在执行阶段,就在 doFirst 之前。正在运行。它被计算出来并且这个值不被存储。此外,最新检查可能取决于之前的任务输出。因此,要解决任务的最新状态,您需要执行它的所有依赖项(dependsOn 任务)。因此,您所要求的理论上仅适用于不是最新的第一个任务。

要了解生命周期是如何工作的,这里有一个简单的例子:

task hello {
    println "CONFIG1"
    outputs.upToDateWhen {
        println "UPTODATE"
        return false
    }
    println "CONFIG2"
    doFirst {
        println "DOFIRST"
    }
    doLast {
        println "DOLAST"
    }
}

如果您使用 --debug 执行此操作标志,你会首先看到这个:
08:05:17.294 [DEBUG] [org.gradle.model.internal.registry.DefaultModelRegistry] Project : - Registering model element 'tasks.hello' (hidden = false)
08:05:17.302 [QUIET] [system.out] CONFIG1
08:05:17.329 [QUIET] [system.out] CONFIG2
08:05:17.333 [DEBUG] [org.gradle.configuration.project.BuildScriptProcessor] Timing: Running the build script took 0.764 secs

配置阶段设置最新检查。然后 Gradle 计算任务图:
08:16:26.212 [DEBUG] [org.gradle.execution.taskgraph.DefaultTaskGraphExecuter] Timing: Creating the DAG took 0.007 secs

然后才执行任务:
08:05:17.430 [INFO] [org.gradle.execution.taskgraph.AbstractTaskPlanExecutor] :hello (Thread[main,5,main]) started.
08:05:17.431 [LIFECYCLE] [class org.gradle.internal.buildevents.TaskExecutionLogger] :hello
08:05:17.432 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Starting to execute task ':hello'
08:05:17.461 [QUIET] [system.out] UPTODATE
08:05:17.465 [INFO] [org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter] Putting task artifact state for task ':hello' into context took 0.032 secs.
08:05:17.465 [DEBUG] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] Determining if task ':hello' is up-to-date
08:05:17.465 [INFO] [org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter] Executing task ':hello' (up-to-date check took 0.0 secs) due to:
  Task.upToDateWhen is false.
08:05:17.466 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter] Executing actions for task ':hello'.
08:05:17.467 [QUIET] [system.out] DOFIRST
08:05:17.467 [QUIET] [system.out] DOLAST

只有在构建任务树并且任务按顺序执行时才会进行最新检查。

由于此检查未存储任何值,因此在不执行任务所依赖的所有任务的情况下无法确定任务的最新状态。

关于gradle - 如果有什么不是最新的,如何询问 gradle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42064270/

相关文章:

php - 从 www-data 触发的 Gradle 有时会失败——没有详细的错误输出

gradle - 如何让Gradle插件设置对插件jar的依赖关系?

linux - 设置 Android Studio 的 GRADLE_HOME

scala - 使用 Gradle 为多个子项目生成单个 ScalaDoc

java - 我的库未检测到其gradle文件中提到的外部依赖项

java - 在Eclipse的Gradle Project中运行JavaMail API

gradle - 在gradle任务中并行化代码

gradle - 在 gradle 项目中设置 Allure 测试报告时出错

Android - 参数类型为 :Exec runs automatically on build, 的顶级 gradle 任务为什么?

gradle - Gradle 中的复制任务在第一次尝试时显示 "UP TO DATE"