今回もガッツリDa★Boの独断と偏見適当翻訳でGoogle先生のBazel導入ドキュメントを平易に纏めていきますよっと。
ご利用は計画的に♥
ちなみに今回の記事の記事の内容が、Bazel を選定するに当たってこれにしようと決めた切欠でもあります。
曰く
- 分割ビルドの記述のしやすさ、わかりやすさ
- 差分ビルドの速さ
この2点です。
これまでの記事で書いてきたとおり、(私にとって)Bazelのビルドルールは簡便で非常に組みやすいのです。
今回のBazelの使途は、CIサーバでテストバイナリとデプロイ用バイナリを同時に別々に出力する構成を作ることです。
そうなってくると、分割ビルドの組やすさは死活問題といっても過言ではありません。
そしてもう一つの差分ビルドの速さですが、これはもう言わずもがな、サーバで動作させるので可能な限り少ないCPU時間で処理してほしいという事情があります。
これらの条件に最も適合し、そして何よりドキュメントが読みやすいことから、BazelはCIサーバ構築にも最適だと言えるでしょう。
さて、ほんじゃ本編に入っていきましょうか。
Bazelのビルドをより良く使う
小規模なプロジェクトであれば、単独のターゲットでのビルドでも十分に対応できます。また、Bazelは、プロジェクトの規模が大きくなるに連れてプロジェクト内を複数のターゲットやパッケージに分割したとしても、差分ビルドによって高速なビルドを実現することが出来ます。
複数のビルドターゲットを指定する
実際に、2つのターゲットを用いたサンプルプロジェクトをビルドしてみましょう。サンプルプロジェクトはstage2、必要な BUILD ファイルは cpp-tutorial/stage2/main に格納されています。
cc_library( name = "hello-greet", srcs = ["hello-greet.cc"], hdrs = ["hello-greet.h"], ) cc_binary( name = "hello-world", srcs = ["hello-world.cc"], deps = [ ":hello-greet", ], )
この BULD ファイルを用いると、Bazel はまず cc_library ルールによって、hello-greet ライブラリをビルドします。
その後、実行ファイルである hello-world をビルドします。
hello-world ターゲットにて指定されているdeps 属性が、hello-world ターゲットのビルドには hello-greet ライブラリが必要であることを Bazel に教示しています。
それではこのプロジェクトを実際にビルドしてみましょう。
ビルドコマンドは stage1 をビルドしたものと同じです。
bazel build //main:hello-world
通常通りビルドが実行されることが確認できます。
Starting local Bazel server and connecting to it... INFO: Analyzed target //main:hello-world (13 packages loaded, 50 targets configured). INFO: Found 1 target... Target //main:hello-world up-to-date: bazel-bin/main/hello-world INFO: Elapsed time: 7.070s, Critical Path: 1.16s INFO: 3 processes: 3 linux-sandbox. INFO: Build completed successfully, 7 total actions
ビルドしたバイナリの実行方法も、stage1と同様です。
bazel-bin/main/hello-world
ここで依存関係グラフを出力して見ましょう。
ビルドコマンドも実行方法も全く一緒でしたが、ビルドしたバイナリの構造が異なっていることがわかります。
stage1:
stage2:
高速な差分ビルド
さて、最後に Bazel の差分ビルドの動作を確認していきましょう。Bazel はプロジェクトの構成ファイルに変更があった場合、そのファイルのみを再コンパイルします。
今回私は hello-greet.cc に記載された挨拶の主語をRandom Gridと変更して保存を行いました。
そのうえで、リビルドを実行しています。
INFO: Analyzed target //main:hello-world (0 packages loaded, 0 targets configured). INFO: Found 1 target... Target //main:hello-world up-to-date: bazel-bin/main/hello-world INFO: Elapsed time: 0.331s, Critical Path: 0.22s INFO: 2 processes: 2 linux-sandbox. INFO: Build completed successfully, 3 total actions
Elapsed time: Critical Path: の情報を比較するとわかりますが、 一回目のビルドと比較してビルドにかかった時間が20分の1程度まで短縮されています。
bazel-bin/main/hello-world Hello Random Grid Fri Mar 6 13:01:40 2020
バイナリの実行結果も変わっていますね。
0 件のコメント:
コメントを投稿