マルチプロジェクトの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 プロジェクトにはまだタスクがありません。
ここでは、この問題をテストするための単純なマルチ プロジェクトを見つけることができます。ルートと ProjA の 2 つのプロジェクトがあります。ルート プロジェクトは、printTasks() 関数をルート プロジェクトの次のイベントに登録する Distribution プラグインを適用します。
project.beforeEvaluate(発生していません)project.afterEvaluateproject.getGradle().projectsEvaluatedproject.getGradle().projectsLoaded(発生していません)project.getGradle().taskGraph.whenReadyproject.allprojects.each { p-> p.afterEvaluate }project.getGradle().addBuildListenerbuildStarted(発生していません)settingsEvaluated(発生していません)projectsLoaded(発生していません)buildFinishedprojectsEvaluated
イベント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
残念ながら、この 2 つのイベントは再作成が遅すぎて、タスクに依存関係を追加できません。
どうすれば解決できますか?