Gradle本机二进制文件插件创建任务时

Gradle本机二进制文件插件创建任务时,gradle,multi-project,gradle-plugin,Gradle,Multi Project,Gradle Plugin,我正在进行一个多项目的gradle配置 在根项目中,有一个插件可以扫描所有子项目以查找“NativeComponents”,然后创建一个通用任务,其中包含找到的所有本机组件构建任务的依赖项 问题是当我设置通用任务的依赖项(组件的构建任务)时。如果在创建泛型任务时(在根项目评估期间)尝试设置依赖项,则会显示错误: Task with path ':CppProj:cppComponentExecutable' not found in root project 'RootProject'. C

我正在进行一个多项目的gradle配置

在根项目中,有一个插件可以扫描所有子项目以查找“NativeComponents”,然后创建一个通用任务,其中包含找到的所有本机组件构建任务的依赖项


问题是当我设置通用任务的依赖项(组件的构建任务)时。如果在创建泛型任务时(在根项目评估期间)尝试设置依赖项,则会显示错误:

Task with path ':CppProj:cppComponentExecutable' not found in root project 'RootProject'.
Cannot call Task.dependsOn(Object...) on task ':distributeTest_CppForArduinoYun_OpenWrt' after task has started execution.
如果我试图在执行阶段(在一般任务执行中)设置依赖项,则不起作用,因为Gradle不允许在任务执行后设置依赖项。它向我显示了错误:

Task with path ':CppProj:cppComponentExecutable' not found in root project 'RootProject'.
Cannot call Task.dependsOn(Object...) on task ':distributeTest_CppForArduinoYun_OpenWrt' after task has started execution.

我还尝试更改项目评估顺序,包括:

subprojects.each { subproject -> evaluationDependsOn ( subproject.path ) }
但是没有成功

当我打印每个子项目的任务数时,它会显示在第一次执行任务之前,NativeBinaries项目仍然没有任务


编辑:

@Opal如何建议,我尝试使用
项目。在评估
语句后,它不起作用。当我在他的“后评估”事件中打印每个项目的任务编号时;NativeBinaries项目仍然没有任务

您可以找到一个简单的多项目来测试这个问题。有两个项目:Root和ProjA。根项目将注册printTasks()函数的分发插件应用于根项目中的以下事件:

  • 项目。评估前
    未提出
  • project.afterEvaluate
  • project.getGradle().projectsEvaluated
  • project.getGradle().projectsLoaded
    未提升
  • project.getGradle().taskGraph.whenReady
  • project.allprojects.each{p->p.afterEvaluate}
  • project.getGradle().addBuildListener
    • buildStarted
      未提升
    • 设置已评估
      未提升
    • 项目已上浮
      未上浮
    • buildFinished
    • 项目评估
事件
project.afterEvaluate
project(gradle).afterEvaluate
ProjA.afterEvaluate
BuildListener::projectsEvaluated
project.getGradle()。projectsEvaluated
打印:

Project | Tasks count
--------|------------
gradle  | 1
ProjA   | 0
Project | Tasks count
--------|------------
gradle  | 1
ProjA   | 8
仅事件
project.getGradle().taskGraph.whenReady
BuildListener::
打印:

Project | Tasks count
--------|------------
gradle  | 1
ProjA   | 0
Project | Tasks count
--------|------------
gradle  | 1
ProjA   | 8
不幸的是,这两个事件重新发布太晚,我无法向任务添加依赖项


知道如何解决吗?

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


关于生成二进制文件的所有其他信息都是
{native_proj}中的内容。二进制文件

尝试在闭包中添加逻辑,作为参数传递到:
project.afterEvaluate
。当我在引发afterEvaluate()时设置依赖项时,Gradle无法找到任务。这是因为NativePlugin尚未执行。因此,一个好的解决方案是在NativePlugin执行之后添加我的逻辑。对吗?我该怎么做呢?在
project.afterEvaluate
中,所有插件都已应用-因此任务应该存在。你有一个可运行的例子吗?嗨@Opal,我在问题文本和可运行的例子中添加了更多的信息。据我所知,最好直接问。请分享讨论的链接。