はじめに
Bazel を初めて使用する場合お問い合わせいただきありがとうございます。この最初の Build チュートリアルでは、 Bazel の使用方法を簡単に説明します。このチュートリアルでは Bazel のコンテキストで使用され、Bazel の基本を説明します。 説明します。必要なツールから始めて、複雑さを増す 3 つのプロジェクトを構築して実行し、複雑になる仕組みと理由を学びます。
Bazel はビルドシステムであり、 は、多言語ビルドをサポートしています。このチュートリアルでは、例として C++ プロジェクトを使用しています 多くの言語に共通する一般的なガイドラインとフローを示します。
所要時間: 30 分
前提条件
まだインストールしていない場合は、まず Bazel をインストールします。このチュートリアルではソース管理に Git を使用するため、最適な結果を得るには Git をインストールします。 あります
次に、任意のコマンドライン ツールで次のコマンドを実行して、Bazel の GitHub リポジトリからサンプル プロジェクトを取得します。
git clone https://github.com/bazelbuild/examples
このチュートリアルのサンプル プロジェクトは examples/cpp-tutorial
ディレクトリにあります。
以下に、その構造を示します。
examples
└── cpp-tutorial
├──stage1
│ ├── main
│ │ ├── BUILD
│ │ └── hello-world.cc
│ └── WORKSPACE
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ └── hello-greet.h
│ └── WORKSPACE
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── WORKSPACE
ファイルは 3 つのセットがあり、各セットはチュートリアルのステージを表します。最初のステージでは、単一のパッケージに存在する単一のターゲットをビルドします。2 番目のステージでは、単一のパッケージからバイナリとライブラリの両方をビルドします。3 つ目のステージ(最後のステージ)では、複数のパッケージを使用してプロジェクトをビルドし、複数のターゲットでビルドします。
概要: はじめに
Bazel(および Git)をインストールし、このチュートリアル用のリポジトリのクローンを作成することで、Bazel を使用した最初のビルドの基盤ができました。次に進む セクションで用語を定義し、ワークスペースを設定します。
スタートガイド
ワークスペースを設定する
プロジェクトを作成する前に、ワークスペースを設定する必要があります。ワークスペースとは プロジェクトのソースファイルと Bazel のビルド出力を保持するディレクトリです。これは、 次の重要なファイルも含まれます。
。ディレクトリとその内容を Bazel ワークスペースとして識別し、 プロジェクトのディレクトリ構造のルートに存在します。WORKSPACE
file- 1 つ以上の
。プロジェクトのさまざまな部分をビルドする方法を Bazel に指示します。ワークスペース内のBUILD
filesBUILD
ファイルを含むディレクトリはパッケージです。(パッケージの詳細は 後ほど説明します)。
今後のプロジェクトで、ディレクトリを Bazel ワークスペースとして指定するには、
そのディレクトリにある WORKSPACE
という名前の空のファイルを探します。このチュートリアルでは、各ステージに WORKSPACE
ファイルがすでに存在しています。
注: Bazel がプロジェクトをビルドする場合、すべての入力が同じワークスペースに存在している必要があります。別々のワークスペースに存在するファイルは、 リンクされていない限り、相互に通信できます。ワークスペースのルールの詳細については、こちらのガイドをご覧ください。
BUILD ファイルを理解する
BUILD
ファイルには、Bazel に関するさまざまな種類の手順が含まれています。各
BUILD
ファイルには少なくとも 1 つのルールが必要です
必要な出力のビルド方法を Bazel に指示する、一連の手順として
バイナリやライブラリなどですビルドルールの各インスタンスは、
BUILD
ファイルはターゲットと呼ばれます。
ソースファイルとdependenciesの特定のセットを指します。
ターゲットは他のターゲットを指すこともできます。
cpp-tutorial/stage1/main
ディレクトリの BUILD
ファイルを確認します。
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
)
この例では、hello-world
ターゲットが Bazel の組み込み cc_binary rule
をインスタンス化します。このルールは、依存関係なしで hello-world.cc
ソースファイルから自己完結型の実行可能バイナリをビルドするように Bazel に指示します。
概要: スタートガイド
いくつかの重要な用語と、Google Cloud の Bazel を使用しています。次のセクションでは、VM のビルドとテストを プロジェクトのステージ 1。
ステージ 1: 単一ターゲット、単一パッケージ
いよいよプロジェクトの第 1 部を完成します。なお、 プロジェクトのステージ 1 セクションの構造は次のとおりです。
examples
└── cpp-tutorial
└──stage1
├── main
│ ├── BUILD
│ └── hello-world.cc
└── WORKSPACE
次のコマンドを実行して cpp-tutorial/stage1
ディレクトリに移動します。
cd cpp-tutorial/stage1
続いて、次のコマンドを実行します。
bazel build //main:hello-world
ターゲット ラベルの //main:
部分は、ワークスペースのルートからの BUILD
ファイルの場所であり、hello-world
は BUILD
ファイル内のターゲット名です。
Bazel の出力は次のようになります。
INFO: Found 1 target...
Target //main:hello-world up-to-date:
bazel-bin/main/hello-world
INFO: Elapsed time: 2.267s, Critical Path: 0.25s
最初の Bazel ターゲットをビルドできました。Bazel は、ビルド出力をワークスペースのルートにある bazel-bin
ディレクトリに配置します。
新しくビルドしたバイナリをテストします。バイナリは次のとおりです。
bazel-bin/main/hello-world
これにより、「Hello world
」のメッセージが出力されます。
ステージ 1 の依存関係グラフは次のとおりです。
概要: ステージ 1
最初のビルドが完了したので、ビルドの構造について基本的な理解ができました。次のステージでは、別の VM を追加して複雑さを あります。
ステージ 2: 複数のビルド ターゲット
小規模なプロジェクトでは 1 つのターゲットで十分ですが、大規模なプロジェクトは複数のターゲットとパッケージに分割することをおすすめします。これにより、増分ビルドを高速化できます。つまり、Bazel は変更された部分のみを再ビルドします。また、プロジェクトの複数の部分を一度にビルドすることで、ビルドを高速化できます。このチュートリアルのこのステージではターゲットを追加し、次のステージではパッケージを追加します。
これは、ステージ 2 で作業するディレクトリです。
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ └── hello-greet.h
│ └── WORKSPACE
cpp-tutorial/stage2/main
ディレクトリの BUILD
ファイルは次のようになります。
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",
],
)
この BUILD
ファイルを使用すると、Bazel はまず hello-greet
ライブラリをビルドし(Bazel の組み込み cc_library rule
を使用して)、次に hello-world
バイナリをビルドします。deps
属性は、
hello-world
ターゲットは、hello-greet
が
hello-world
バイナリをビルドするにはライブラリが必要です。
この新しいバージョンのプロジェクトをビルドする前に、ディレクトリを変更して cpp-tutorial/stage2
ディレクトリに切り替える必要があります。次のコマンドを実行します。
cd ../stage2
これで、次のよく知られたコマンドを使用して新しいバイナリをビルドできます。
bazel build //main:hello-world
繰り返しになりますが、Bazel は次のようなコードを生成します。
INFO: Found 1 target...
Target //main:hello-world up-to-date:
bazel-bin/main/hello-world
INFO: Elapsed time: 2.399s, Critical Path: 0.30s
これで、新しくビルドしたバイナリをテストできます。このバイナリは別の「Hello world
」を返します。
bazel-bin/main/hello-world
hello-greet.cc
を変更してプロジェクトを再ビルドすると、Bazel はそのファイルのみを再コンパイルします。
依存関係グラフを見ると、hello-world
は hello-greet
という名前の追加入力に依存していることがわかります。
概要: ステージ 2
これで、2 つのターゲットを含むプロジェクトが作成されました。hello-world
ターゲットのビルド
1 つのソースファイルで、他の 1 つのターゲット(//main:hello-greet
)に依存します。
2 つの追加のソースファイルをビルドします。次のセクションでは、さらに進んで別のパッケージを追加します。
ステージ 3: 複数のパッケージ
この次のステージでは、複雑さがさらに増し、複数のパッケージを含むプロジェクトをビルドします。cpp-tutorial/stage3
ディレクトリの構造と内容は次のとおりです。
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── WORKSPACE
2 つのサブディレクトリがあり、それぞれに BUILD
ファイルが含まれていることがわかります。したがって、Bazel から見ると、ワークスペースには lib
と main
の 2 つのパッケージが含まれています。
lib/BUILD
ファイルを確認します。
cc_library(
name = "hello-time",
srcs = ["hello-time.cc"],
hdrs = ["hello-time.h"],
visibility = ["//main:__pkg__"],
)
main/BUILD
ファイルで次のようにします。
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",
"//lib:hello-time",
],
)
メイン パッケージの hello-world
ターゲットは、lib
パッケージの hello-time
ターゲットに依存しています(ターゲットラベル //lib:hello-time
がそのことを示しています)。Bazel は deps
属性を通じてこれを認識します。これは依存関係グラフに反映されています。
ビルドを成功させるには、lib/BUILD
で //lib:hello-time
ターゲットを作成します。
visibility 属性を使用して、main/BUILD
のターゲットに明示的に表示できます。
これは、デフォルトではターゲットは、同じリージョン内の他のターゲットにのみ表示されるためです。
BUILD
ファイル。Bazel はターゲットの可視性を使用して、ライブラリなどの問題を防止します。
これには、公開 API に漏洩する実装の詳細が含まれます。
プロジェクトのこの最終バージョンをビルドします。次のコマンドを実行して、cpp-tutorial/stage3
ディレクトリに切り替えます。
cd ../stage3
再度、次のコマンドを実行します。
bazel build //main:hello-world
Bazel は次のようなコードを生成します。
INFO: Found 1 target...
Target //main:hello-world up-to-date:
bazel-bin/main/hello-world
INFO: Elapsed time: 0.167s, Critical Path: 0.00s
次に、このチュートリアルの最後のバイナリで、最終的な Hello world
メッセージをテストします。
bazel-bin/main/hello-world
まとめ: ステージ 3
これで、プロジェクトを 3 つのターゲットを含む 2 つのパッケージとしてビルドし、 これにより、将来を見据えたソリューションの構築に 紹介しました。次のセクションでは、Bazel の学習を継続する方法について説明します。
次のステップ
これで、Bazel を使用した最初の基本的なビルドが完了しました。しかし、これはほんの始まりにすぎません。Bazel を使用した学習を続けるためのリソースをいくつかご紹介します。
- C++ に焦点を当てるには、一般的な C++ ビルドのユースケースをご覧ください。
- Bazel を使用して他のアプリケーションのビルドを開始するには、Java、Android アプリケーション、iOS アプリケーションのチュートリアルをご覧ください。
- ローカル リポジトリとリモート リポジトリの操作の詳細については、 外部依存関係。
- Bazel のその他のルールについて詳しくは、こちらのリファレンス ガイドをご覧ください。
ご利用をお待ちしております。