Когда плагин Gradle Native Binaries создает задачи

Я работаю над многопроектной конфигурацией 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

К сожалению, эти два события повторяются слишком поздно, и я не могу добавить зависимости к задачам.

Есть идеи, как я могу это решить?


person Secort    schedule 10.10.2015    source источник
comment
Попробуйте добавить свою логику в замыкание, переданное в качестве аргумента: project.afterEvaluate.   -  person Opal    schedule 10.10.2015
comment
Когда я устанавливаю зависимости, когда вызывается afterEvaluate(), Gradle не может найти задачи. Это связано с тем, что NativePlugin еще не был выполнен. Таким образом, хорошим решением может быть добавление моей логики после выполнения NativePlugin. Верно? Как я могу это сделать?   -  person Secort    schedule 12.10.2015
comment
В project.afterEvaluate все плагины уже применены - значит задача должна существовать. У вас есть работающий пример?   -  person Opal    schedule 12.10.2015
comment
Привет @Opal, я добавил больше информации в текст вопроса и пример запуска.   -  person Secort    schedule 13.10.2015
comment
Насколько я понимаю, будет лучше спросить напрямую на discuss.gradle.org. Поделитесь ссылкой на обсуждение, пожалуйста.   -  person Opal    schedule 16.10.2015


Ответы (1)


Событие, которое нужно зарегистрировать, чтобы найти все определенные задачи проекта, — rootProject.gradle.taskGraph.whenReady. Если мы распечатаем задачи для любых проектов, когда возникает это событие, то мы сможем найти все задачи, необходимые для создания нативных двоичных файлов.

Вся остальная информация о генерации бинарников содержится в {native_proj}.binaries.

person Secort    schedule 14.10.2015