BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Bazel 2.0がリリース、パフォーマンスと安定性が向上

Bazel 2.0がリリース、パフォーマンスと安定性が向上

原文(投稿日:2020/02/06)へのリンク

Googleの社内ビルドツールであるBlazeから生まれたビルドおよびテスト用ツールのBazelが先日、バージョン2.0をリリースした。今回のリリースでは、過去のバージョンと互換性のない変更がいくつか導入されると同時に、安定性およびパフォーマンスの面で多くの改善が行われている。

Bazelは、大規模なコードベースや複数のコンパイル言語、高度なテストを持つプロジェクトを処理する、オープンソースのビルドツールである。ローカルキャッシュと分散キャッシュという2種類のキャッシュと依存性分析を併用することにより、変更セットの影響する部分のみをビルドすることが可能だ。さらに、並列分散型のビルド処理が可能なように設計されているため、ビルド時間を最小化することができる。InfoQでは以前にも、Bazelとその機能を詳細に論じた記事を公開している。

今回の発表は、10月のバージョン1.0のリリースから間もなく行われた。1.0リリースでは、安定性の向上と後方互換性の保証が謳われていたが、今回のメジャーリリースは、将来的なリリースがセマンティックバージョニングに従うというコミットメントに沿っていると同時に、互換性のない変更を含む可能性を持つものとなっている。

"--incompatible_remap_main_repo"フラグがデフォルトで有効になり、メインリポジトリにアクセスする2種類のメソッド(名称指定と"@"指定)が同じリポジトリを参照するものとして解釈されるようになった。この変更は、レポジトリ内のラベルの評価に影響する。例えばfooというレポジトリでは、"@foo//some/path:lib"と"//some/path:lib"は同じラベルになる。

"--incompatible_remove_native_maven_jar"フラグがデフォルトで有効になると同時に、フラグ自体が廃止されたことにより、ネイティブなmaven_jarルールが使用不可能になった。ワークスペースファイルの適切なアップデートを支援するために、自動マイグレーションツールが提供されている。手作業によるファイルのアップデートも可能だ。例えば、次のようなWORKSPACEファイルがあれば、

maven_jar(
  name = "truth",
  artifact = "com.google.truth:truth:0.30",
  sha1 = "9d591b5a66eda81f0b88cf1c748ab8853d99b18b",
)

アップデート後は、次のようにする必要がある。

load("@bazel_tools//tools/build_defs/repo:jvm.bzl", "jvm_maven_import_external")
jvm_maven_import_external(
  name = "truth",
  artifact = "com.google.truth:truth:0.30",
  artifact_sha256 = "59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a",
  server_urls = ["http://central.maven.org/maven2"],
  licenses = ["notice"], # Apache 2.0
)

"licenses"属性が必須になったことと、サポートがSHR256のみになったことに注意が必要だ。既存の"maven_jar"ターゲットでserver_urls値が指定されていなかった場合は、デフォルトサーバ"http://central.maven.org/maven2"を使用する必要がある。

その他の変更点としては、aaptのサポートが廃止され、デフォルトでaapt2が使用されるようになった。"--incompatible_disallow_lookup_unhashable_keys"フラグがデフォルトで有効になり、inまたはdict.getによるdictキーの検索がハッシュ不能型(unhashabe types)としてエラーとなるようになった。同じように、symlinkのループや無限拡張が発生するglob評価がある場合、パッケージローディングが常に失敗するようになった。

runfilesマニフェストファイルは、将来のバージョンで廃止される予定である。このファイルに関しては、空白文字のある場合に安全でないことと、リモート実行時でもローカルCPUを消費することが、開発チームによって警告されている。試験的フラグ"--experimental_skip_runfiles_manifests"により、今回の変更に関する初期動作をテストすることが可能だが、詳細なセマンティクスはまだ変更される可能性があるので、注意が必要だ。

リリースに対する開発者の印象は概ね肯定的だが、プロジェクトでBazelを使用する際の課題に関するコメントが多数寄せられている。ycombinatorでのコメントのいくつかは、既存プロジェクトにBazelを組み込む際に感じるフラストレーションに言及している。ユーザ名habituteは、"小規模な開発サイトでは、例えばMake(あるいは中心的に使用している言語の標準的なビルドシステム)に対して、Bazelの提供するメリットはほとんどないでしょう"、とコメントしている。これに対して、ユーザ名malkiaは、ビルドの効率性や依存グラフを生成する必要を考えれば、この"偏屈な"ツールの採用にはコスト以上のメリットがあり、投資に値する、という意見である。ユーザ名klodophも肯定的で、"Bazelを使うことで、他のコンピュータにリポジトリをチェックアウトしたり、他の人たちと開発作業をする時でも、一貫した結果が得られるという自信を強く持てるようになりました"とコメントしている

BazelはmacOS、Ubuntu、Fedora/CentOS、Windows用にダウンロードが可能だ。昨年の12月にはBazelCon 2019が開催されていて、カンファレンスの様子を収めた映像が公開されている。

この記事に星をつける

おすすめ度
スタイル

BT