Как диагностировать / устранить неполадки сборки Gradle, не выполняющей задачу зависимости? - PullRequest
0 голосов
/ 14 сентября 2018

Я добавляю 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

build.gradle подпроекта 'cppproj'

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? Поскольку dependsOn явно вызывается в моем коде, я ожидаю ошибку, что либо подпроект, либо задачи не найдены, либо зависит от самого себя, как-то не получится. Связано ли это с гибкостью gradle возможности ссылаться на вещи, которые еще не существуют?

Что значит «Реализовать задачу»? Не удалось найти это документально. Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Просто добавив ответ на мой вопрос продолжения: почему этот, казалось бы, эквивалентный синтаксис не может достичь того же: project("cppproj").tasks["build"].dependsOn.

Я обнаружил, что шаг "конфигурирования" сборки gradle выполняется по умолчаниюв нисходящем порядке, то есть при выполнении корневого проекта build.gradle подпроекты еще не содержат своих задач.Это можно изменить, выполнив:

evaluationDependsOnChildren()

... и затем можно написать:

subprojects.each {
    it.tasks["build"].dependsOn myPreCompileTask
}
0 голосов
/ 14 сентября 2018

Вы не используете правильный способ доступа к задаче : cppproj: build в вашей корневой сборке проекта: вы используете project.task () методы, которые фактически создаютновая задача.

У вас есть несколько доступных способов «найти» задачу, которую вы хотите настроить (добавив ограничение зависящее от нее), как описано здесь: поиск задач

В вашем случае вы могли бы написать:

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

Примечание 1:

При использовании синтаксиса task(":cppproj:build").dependsOn precompiletask: вы создаете новую задачу с именем ': cppproj: build' в корневом проекте исделать так, чтобы она зависела от предварительной компиляции: поэтому предварительная компиляция не выполняется, если вы выполняете задачи build из родительского или подпроектного проекта.

Примечание 2:

// Также пробовал это -> ошибка "Невозможно добавить задачу 'build', поскольку задача с таким именем уже существует";с какой стати этот синтаксис добавляет задачу "построить"?//project(":cppproj").task("build").dependsOn precompiletask

=>, поскольку метод project.task(String) создает задачу, поэтому вы пытаетесь добавить новую задачу с именем build для подпроекта, в котором уже есть одна build задача.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...