1

我正在研究多项目 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。根项目将注册 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.afterEvaluateproject(gradle).afterEvaluateproject(ProjA).afterEvaluateBuildListener::projectsEvaluated打印project.getGradle().projectsEvaluated

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

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

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

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

知道我该如何解决吗?

4

1 回答 1

1

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

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

于 2015-10-14T20:13:52.790 回答