如何诊断/排除 gradle build not 运行 依赖任务?

How to diagnose / troubleshoot gradle build not running dependency task?

我正在将 gradle 添加到多项目构建中并达到学习曲线。

我需要在编译子项目之前调用 type:Exec 的自定义任务。该任务未被调用。为什么?

build.gradle 父项目

task precompiletask(type:Exec) {
    println "Executing pre-compile task"
    // ...
}

task(":cppproj:build").dependsOn precompiletask

// Also tried this, same output
//project(":cppproj").task(":build").dependsOn precompiletask

// Also tried this -> error "Cannot add task 'build' as a task with that name already exists"; why on Earth would this syntax *add* the task "build"?
//project(":cppproj").task("build").dependsOn precompiletask // I also tried this
子项目 'cppproj' 的

build.gradle
apply plugin: "cpp"

model {
    components {
        api(NativeLibrarySpec) {
            sources {
                // ...
            }
        }
    }
}

-


相关问题

为什么我觉得很难调试它?我是 运行 gradle,输出最详细 (gradle build --debug --warning-mode all)。我的自定义任务 precompiletask 中唯一提到的是这些,集中在输出的开头:

07:24:41.151 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Realize task :precompiletask' started
07:24:41.243 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Completing Build operation 'Realize task :precompiletask'
07:24:41.243 [DEBUG] [org.gradle.internal.operations.DefaultBuildOperationExecutor] Build operation 'Realize task :precompiletask' completed
07:24:41.249 [QUIET] [system.out] Executing pre-compile task

为什么没有与使用 dependsOn link 两个任务失败相关的错误?由于 dependsOn 在我的代码中被明确调用,我预计会出现一个错误,即找不到子项目或任务,或者 dependsOn 本身以某种方式失败。这是否与 gradle 能够引用尚不存在的内容的灵活性有关?

这对 'Realize task' 意味着什么?无法找到此记录。谢谢。

您没有使用正确的方法访问根项目构建中的 :cppproj:build 任务:您正在使用 project.task() 方法,这实际上是在创建一个新任务。

您有多种方法可用于 'locate' 您要配置的任务(添加 dependsOn 约束),如此处所述:locating tasks

在你的情况下你可以这样写:

tasks.getByPath(':cppproj:build').dependsOn precompiletask

注一:

使用语法 task(":cppproj:build").dependsOn precompiletask 时:您在根项目上创建一个名为“:cppproj:build”的新任务并使其依赖于预编译任务:这就是 precompiletask[=35= 的原因] 如果您从父项目或子项目执行 build 任务,则不会执行。

注2:

// Also tried this -> error "Cannot add task 'build' as a task with that name already exists"; why on Earth would this syntax add the task "build"? //project(":cppproj").task("build").dependsOn precompiletask

=> 因为 project.task(String) 方法创建了一个任务,所以你试图将名为 build 的新任务添加到已经有一个 构建任务。

只是为我的 sequel 问题添加一个答案:为什么这个看似等效的语法无法实现相同的目的:project("cppproj").tasks["build"].dependsOn.

我发现 gradle 构建的 "configuration" 步骤默认是以自上而下的方式完成的,这意味着当根项目 build.gradle 被执行时,子项目不会尚未包含他们的任务。这可以通过以下方式更改:

evaluationDependsOnChildren()

...然后可以写:

subprojects.each {
    it.tasks["build"].dependsOn myPreCompileTask
}