当 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.afterEvaluateproject(gradle).afterEvaluateproject(ProjA).afterEvaluateBuildListener::projectsEvaluatedproject.getGradle().projectsEvaluated 打印:

Project | Tasks count
--------|------------
gradle  | 1
ProjA   | 0

仅事件 project.getGradle().taskGraph.whenReadyBuildListener:: 打印:

Project | Tasks count
--------|------------
gradle  | 1
ProjA   | 8

不幸的是,这两个事件重新发布得太晚了,我无法将依赖项添加到任务中。

知道我该如何解决吗?

要注册以查找已定义的所有项目任务的事件是 rootProject.gradle.taskGraph.whenReady。如果我们在引发此事件时打印任何项目的任务,那么我们可以找到构建本机二进制文件所需的所有任务。

关于二进制文件生成的所有其他信息都在 {native_proj}.binaries 中。