BazelとGradleの違いは何ですか?質問する

BazelとGradleの違いは何ですか?質問する

Googleはオープンソースビルドツールバゼルこのツールとの違いは何ですか?グラドル? Gradle ではできないこと、Gradle の方が優れている点、Gradle の方が優れている点は何ですか?

ベストアンサー1

免責事項: 私は Bazel に取り組んでおり、Gradle に詳しいわけではありません。ただし、同僚の 1 人が 2 つのシステムの比較を書いていたので、ここで要約します。

Bazel と Gradle は、ビルド エクスペリエンスの異なる側面を重視しています。ある程度、それらの優先順位は互換性がありません。Gradle は柔軟性と非干渉性を重視しているため、ビルド構造に適用できる制限が制限されますが、Bazel は信頼性とパフォーマンスを重視しているため、必然的に交渉の余地のない制限が適用されます。

Gradle は Bazel と同じ原則を重視しています。つまり、Gradle チームはパフォーマンス (増分ビルド、並列化された構成と実行、Gradle デーモン)、正確性 (コンテンツ ベースの「最新」チェック)、再現性 (宣言型構文、依存関係のバージョン管理、明示的に宣言された依存関係の豊富なサポート) に細心の注意を払っています。また、Bazel は柔軟なプロジェクト レイアウトの必要性を尊重しています。

ニュアンスは、Gradle は優れたプラクティスを促進したいのに対し、Bazel はそれを必須にしたいということです。Gradle は、Ant エクスペリエンス (一貫性のない結果を伴う独自のプロジェクト構造を自由に定義できる) と Maven エクスペリエンス (さまざまなプロジェクト ニーズに対応できない強制的なベスト プラクティス) の中間を目指しています。Bazel は、強力なワークフローを可能にする強力な保証を犠牲にすることなく、柔軟なプロジェクト サポートが可能であると考えています。

どちらの哲学がより「正しい」ということはありません。プロジェクトに最適なツールは、その特定のプロジェクトの価値によって決まります。

Gradle の概要

Gradle は柔軟性の高いシステムで、ユーザーはプロジェクトの編成方法に最小限の制約で、完全で信頼性の高いビルド フローを簡単に構築できます。これは、強力なビルディング ブロック (依存関係の自動追跡と取得、緊密に統合されたプラグイン サポートなど) と、ユーザーが望むようにこれらのブロックを組み合わせることができる汎用的でチューリング完全なスクリプト インターフェイスを提供することで実現します。

Gradle は次の機能を重視しています。

  • 他のシステムからの移行が簡単。Gradle は、あらゆるプロジェクト組織に簡単に適応し、任意のワークフロー構造を簡単に実装できます。Ant タスクをネイティブに理解し、Maven および Ivy リポジトリとネイティブに統合されます。
  • 高度に拡張可能なスクリプト モデル。ユーザーは Groovy スクリプトを記述してすべてのビルド ロジックを実装します。「ビルド」とは、基本的にオープンエンドでオーバーライド可能、拡張可能なメソッド定義である汎用タスクを依存関係に基づいて順番に実行することです。
  • 豊富な依存関係管理。バージョン管理された依存関係は、外部コード リポジトリ、ローカル ファイル システム、およびその他の Gradle プロジェクトから宣言され、自動的にステージングされます。ビルド出力も同様に、リポジトリやその他の場所に自動的に公開できます。
  • 緊密に統合されたプラグイン システム。プラグインは、目的のワークフローを容易にするために整理されたタスクのバンドルです。Gradle の「コア」機能の多くは、実際にはプラグイン (Java、Android など) を通じて実装されています。プラグインは (独自の判断で) ビルド スクリプト ロジックと緊密にやり取りします。プラグインは、Gradle のコア データ構造に深くアクセスできます。

Bazelの概要

Bazel は、Google の社内プロジェクトを確実かつ効率的に構築する必要性から生まれました。Google の開発環境は異常に大きく複雑であるため、Bazel はビルドの整合性について異常に強力な保証を提供し、それを実現するためのパフォーマンス オーバーヘッドは異常に低くなっています。

これにより、再現可能なビルドを中心に構築された強力な開発ワークフローの基盤が提供されます。ここで、「ビルド」は、参照、繰り返し、さまざまなマシンに渡され、任意のプログラムやサービスに渡される抽象的なエンティティになり、すべてのインスタンスがまったく同じであることが認識されます。

Bazel は次の機能を強調しています。

  • 正確さ。Bazel ビルドは、常に正しい出力を生成するように設計されています。2 人のユーザーが、異なるマシンで同じコミットで同じ Bazel フラグを使用して同じビルドを呼び出すと、同じ結果が表示されます。増分ビルドはクリーン ビルドと同じくらい確実に正しいため、クリーン ビルドは基本的に不要になります。
  • パフォーマンス。ビルドは、利用可能なリソースを前提として、本質的に可能な限り高速に実行されるように設計されています。タスクは、依存関係チェーンが許す限り並列化できます。不要な作業は実行されません (つまり、「最新の」タスクは常にスキップされます)。作業は、当然のことながら、ローカル マシンの制限を克服するためにリモート実行者に委託できます。
  • 再現性。ビルドのインスタンスは、どの環境でも忠実に再現できます。たとえば、バグ レポートにソフトウェア Y のバージョン X が運用環境 Z で失敗すると記載されている場合、開発者は自分のマシンでそれを忠実に再現し、同じものをデバッグしていることに自信を持っています。

おすすめ記事