当 Gradle 本机二进制文件插件创建任务时
When Gradle Native Binaries Plugin create tasks
我正在处理多项目 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 项目仍然有零个任务。
Here你可以找一个简单的多项目来测试这个问题。有 2 个项目:Root 和 ProjA。根项目将注册 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
(未提出)
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
不幸的是,这两个事件重新发布得太晚了,我无法将依赖项添加到任务中。
知道我该如何解决吗?
要注册以查找已定义的所有项目任务的事件是 rootProject.gradle.taskGraph.whenReady
。如果我们在引发此事件时打印任何项目的任务,那么我们可以找到构建本机二进制文件所需的所有任务。
关于二进制文件生成的所有其他信息都在 {native_proj}.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 项目仍然有零个任务。
Here你可以找一个简单的多项目来测试这个问题。有 2 个项目:Root 和 ProjA。根项目将注册 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
(未提出)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
不幸的是,这两个事件重新发布得太晚了,我无法将依赖项添加到任务中。
知道我该如何解决吗?
要注册以查找已定义的所有项目任务的事件是 rootProject.gradle.taskGraph.whenReady
。如果我们在引发此事件时打印任何项目的任务,那么我们可以找到构建本机二进制文件所需的所有任务。
关于二进制文件生成的所有其他信息都在 {native_proj}.binaries
中。