我正在进行多项目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
语句,但它没有用。当我打印每个项目的任务编号时,在他的评估之后'事件; NativeBinaries项目仍然没有任务。
Here你可以找到一个简单的多项目来测试这个问题。 Ther 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
不幸的是,这两个事件太迟了,我无法为任务添加依赖项。
知道如何解决它?
答案 0 :(得分:1)
要注册以查找定义的所有项目任务的事件是rootProject.gradle.taskGraph.whenReady
。如果我们在引发此事件时打印任何项目的任务,那么我们可以找到构建本机二进制文件所需的所有任务。
关于二进制文件生成的所有其他信息都在{native_proj}.binaries
中。