Я работаю над многопроектной конфигурацией gradle.
В корневом проекте есть плагин, который сканирует все подпроекты в поисках «NativeComponents», а затем создает общую задачу с зависимостями для всех найденных задач сборки собственного компонента.
Проблема заключается в том, что я устанавливаю зависимости (для задач сборки компонента) общей задачи. Если я попытаюсь установить зависимости при создании общей задачи (во время оценки корневого проекта), это покажет мне ошибку:
Task with path ':CppProj:cppComponentExecutable' not found in root project 'RootProject'.
Если я попытаюсь установить зависимости на этапе выполнения (при выполнении общей задачи), это не сработает, потому что Gradle не позволяет устанавливать зависимости после выполнения задачи. Он показывает мне ошибку:
Cannot call Task.dependsOn(Object...) on task ':distributeTest_CppForArduinoYun_OpenWrt' after task has started execution.
Я пытался также изменить порядок оценки проекта следующим образом:
subprojects.each { subproject -> evaluationDependsOn ( subproject.path ) }
но без особого успеха.
Когда я печатал номера задач для каждого подпроекта, он показывал мне проекты NativeBinaries с нулевыми задачами до выполнения первой задачи.
ИЗМЕНИТЬ:
Как предлагает @Opal, я пытался использовать оператор project.afterEvaluate
, но это не сработало. Когда я напечатал количество задач каждого проекта в его событии afterEvaluate; в проектах NativeBinaries до сих пор нет задач.
Здесь вы можете найти простой мультипроект для проверки этой проблемы. Есть 2 проекта: Root и ProjA. Корневой проект применяет плагин Distribution, который регистрирует функцию printTasks() к следующим событиям в корневом проекте:
project.beforeEvaluate
(НЕ поднято)project.afterEvaluate
project.getGradle().projectsEvaluated
project.getGradle().projectsLoaded
(НЕ поднято)project.getGradle().taskGraph.whenReady
project.allprojects.each { p-> p.afterEvaluate }
project.getGradle().addBuildListener
buildStarted
(NOT raised)settingsEvaluated
(НЕ поднято)projectsLoaded
(НЕ поднято)buildFinished
projectsEvaluated
События project.afterEvaluate
, project(gradle).afterEvaluate
, project(ProjA).afterEvaluate
, BuildListener::projectsEvaluated
и project.getGradle().projectsEvaluated
распечатываются:
Project | Tasks count
--------|------------
gradle | 1
ProjA | 0
Выводятся только события project.getGradle().taskGraph.whenReady
и BuildListener::
:
Project | Tasks count
--------|------------
gradle | 1
ProjA | 8
К сожалению, эти два события повторяются слишком поздно, и я не могу добавить зависимости к задачам.
Есть идеи, как я могу это решить?
project.afterEvaluate
. - person Opal   schedule 10.10.2015project.afterEvaluate
все плагины уже применены - значит задача должна существовать. У вас есть работающий пример? - person Opal   schedule 12.10.2015