3

非常に大規模で複雑なエンタープライズアプリ用にGradleを試しています。マルチプロジェクトビルド構造を使用しており、Gradleの並列実行機能に非常に興奮しています。

コードベースは、次のようなドメインレイヤーで構成されています。

UIモジュール(〜20)->共有UI->ドメイン->dao->フレームワーク

依存関係は一方向であり、ビルドはボトムアップで行われます。

残念ながら、ビルド時間の大幅な向上は見られません。以前にアリで得ていたものとほとんど同じです。

並列モードでのタスクの実行シーケンスを見ると、正しく見えないことがいくつかあります。Gradleは、コアレイヤーを構築するときに、最初にタスクを順番に実行することを期待しています。したがって、フレームワーク、dao、ドメイン、共有UIをアセンブルした後、他のすべてを並行してキックする必要があります。

しかし、私たちが見ている実行シーケンスは、次のようなものです。

framework.assemble-> dao.assemble-> domain.assemble-> shared.ui.assemble->その他のUImodules.assmble(並列)->war->その他のUI.check+ shared.ui.check + dao.check (並行して)-> domain.check-> framework.check

ボトルネックは、ドメインとフレームワークのチェックを並行してではなく順番に実行しているときに終了します。これらの2つのモジュールは、約12kの単体テストを備えた私たちにとって最大のモジュールであり、実行には約4分かかります。

Gradleタスクを使用して依存関係を調べることに多くの時間を費やしました。これらのモジュールのすべてのテストタスクは完全に独立しており、実行を妨げるものは何もありません。

これが既知の問題なのか、それともGradleが並列モードで実行順序を決定する方法として、Gradleで追加のデバッグを有効にして、より多くの洞察を得る方法があるのか​​疑問に思っています。どんな助けでも大歓迎です。

4

1 に答える 1

3

Gradle 1.4以降、並列タスクの実行は(意図的に)いくつかの方法で制約されています。特に、いつでも実行される一連のタスクには、同じプロジェクトに属する2つのタスクは含まれません。これは時間の経過とともに改善されます。ログから取得するもの以外のデバッグ支援機能(例:)を認識していません--debug

並列テストの実行は別の機能であることに注意してください。同じプロジェクトに多数のテストがある場合、test.maxParallelForks = xx> 1の場合、顕著なスピードアップが見られるはずです。xの値は、実験的に決定するのが最適です。適切な出発点は、マシン上の物理コアの数です(例Runtime.getRuntime().availableProcessors() / 2)。

于 2013-02-21T08:47:34.803 に答える