Gradleの依存関係のグラフの実世界の例は何ですか?

StackOverflow https://stackoverflow.com/questions/2414281

  •  19-09-2019
  •  | 
  •  
役に立ちましたか?

解決

この挑発的な質問は、最終的にはGradleのに探して動機を提供しました。私はまだそれを使用していないので、ドキュメントではなく、個人的な物語を閲覧しながら、私は唯一の分析が指摘提供することができます。

私の最初の質問はGradleのタスク依存グラフが非環式であることが保証されている理由でした。場合、私は前に最初のタスクの実行にその答えを見つけることができませんでしたが、逆の場合は、容易に構築されたので、私はサイクルの検出がグラフが構築されるときに実行され、検証されることを想定しますと、ビルドが失敗します違法な循環的な依存関係があります。ビルドがほぼ完了するまで、最初のグラフを構築せずに、この障害状態が発見されない場合があります。また、検出ルーチンは、すべてのタスクを実行した後、グラフが漸増し、利用可能なグローバル建設された限り、(非常に非効率的であると思われる、実行しなければならない、深さ優先探索は、唯一の出発点を見つけるために必要な、そしてそれに続くことになりますサイクルの評価は、最小限の作業が必要になりますが、合計作業はまだ開始時に関係の全体集合)上の単一の削減を行うよりも大きいだろう。私は大きな利点として、早期発見をチョークと思います。

タスク依存性(参照:4.3タスクの依存関係、および13.14における従来例)遅延することができます。グラフ全体が構築されるまで怠惰なタスクの依存関係を正しく評価することができませんでした。同じことは、無数の問題を引き起こす可能性があります推移(非タスク)依存性の解決のために真であり、追加の依存関係が発見され、解決された(また、リポジトリへの再三の要求を必要とする)繰り返し再コンパイルが必要です。タスクルール機能(13.8)は、いずれかのことができないであろう。これらの問題、そしておそらく他の多くは、Gradleのは動的言語を使用していることを考慮して一般化することができ、かつ動的に追加し、タスクを変更することができますので、実行パスが構築されているので、最初のパスの評価に先立って、結果は非決定論的可能性と依存関係や、彼らがまだ作成されていないので、後になるまで未知であり、行動の指示がある場合は、実行時に変更され、したがって、評価の異なるシーケンスは、任意に異なる結果を生成することができます。 (これは、いくつかの具体的な例を調査する価値があるかもしれ、それが真である場合には、さえ二つのパスは必ずしも十分ではない場合 - 。。> B、B - つまりそれは、もはやCはの動作を変更> C、その後、あなたは問題がある、Bに依存しています。私は、任意のタスクでそれを許可しないように、非ローカルスコープでメタプログラミングを制限する上でいくつかのベストプラクティスがあります願っています。楽しいの例では、孫タイムトラベルのパラドックスのシミュレーションになります彼の祖父を殺すか、彼の祖母と結婚、鮮やかにいくつかの実用的な倫理原則を示す!)

これは、現在実行中のビルドに報告し、より良い状態と進行状況を有効にすることができます。 TaskExecutionListenerは、各タスクの処理にフックの後/前に提供していますが、残りのタスクの数を知らなくても、ずっとそれ以外の状態について言うことができるがありません「完成6つのタスク。タスクのfooを実行しようとしています。」代わりに、あなたはgradle.taskGraph.whenReady内のタスクの数とTaskExecutionListenerを初期化し、その後、TaskExecutionGraphに添付できます。今ではのようなレポートの詳細有効にするために情報を提供できる「6〜72のタスク完了今すぐ実行中のタスクのFOOを推定残り時間:2時間の38メートルを」 Gradleのは、大規模なマルチプロジェクトのビルドと時間の見積もりが重要だったオーケストレーションするために使用されていた場合には、継続的インテグレーションサーバーのコンソールに表示することが有用である、またはなります。

ジェリーブラードによって指摘したように環境が部分的DAG部による構成で実行コンテキスト(実施例4.15によって決定されるため、ライフサイクルの評価部が、環境に関する情報を提供する実行計画を決定するために重要です)。また、私は、これは、実行の最適化のために有用である見ることができました。 INDEPEND耳鼻咽喉科サブパスを安全に別のスレッドに渡すことができます。彼らはナイーブでない場合は、実行するためのアルゴリズムを歩くことは(私の直感はいつも以上のサブパスを持つパスを好むよりも、常に最もサブパスでパスを歩くことは、より大きなスタックにつながるしようとしていることを述べている)少ないメモリ集約することができます。

このの興味深い使用は、システムの多くのコンポーネントが最初にデモやインクリメンタル開発をサポートするために、スタブアウトされている状況であるかもしれません。次いで、現像時、むしろ各コンポーネントが実装サブまだ含めるための準備ができている場合、ビルド自体が決定することができるほどビルド構成を更新するよりも(おそらくそれは、コードを取得してコンパイルし、所定のテストスイートを実行しようとします) 。もしそうであれば、評価段階は、このことを明らかにする、そして適切なタスクが含まれることになる、それ以外の場合は、スタブのためのタスクを選択します。おそらく、そこにまだ利用できないOracleデータベースへの依存だ、とあなたはその間に組み込みデータベースを使用しています。あなたは、ビルドは透過的に、可用性をチェックしたときにそれができる切り替えてみましょう、それはむしろあなたがそれを伝えるよりも、データベースを切り替えることを言うことができます。これらの線に沿って創造的な用途の多くがあるかもしれません。

のGradleは素晴らしい見えます。いくつかの研究を誘発してくれてありがとう!

他のヒント

私は今、別のビルドシステムを評価することだし、Gradleではで私はすべてのjarマニフェストは、後で使用されている(「ビルド番号」属性が含まれていることを、タイプのすべてのタスクのjarファイル」を列挙し、ので、それらを変更する醜いコードを追加するために管理しました)最終的なファイル名を構成するには:

gradle.taskGraph.whenReady {
    taskGraph ->
    taskGraph.getAllTasks().findAll {
        it instanceof org.gradle.api.tasks.bundling.Jar
    }.each {
        it.getManifest().getAttributes().put('Build-Number', project.buildVersion.buildNumber)
    }
}
scroll top