次世代ビルドツール Bazelに入門してみました

こんにちは、田渕です。

いつもは、技術は後追いスタンスなんですが(汗)、今回は少しでも新しい技術に触れてみようと思い、
Bazelを触ってみました。今回はBazelの入門編について紹介しようと思います。

今、私の周辺では何をするにもgradleが全盛です。やっとGradleになれてきたところです(笑)。
Bazelとは、Googleが社内で使用していたビルドツールで、オープンソースとして公開されています。
Bazelの発音ですが、FAQによると、「ベイゼル」が近いようです。
2016年3月現在は、β版での提供となっています。ロードマップがこちらに示されていますが、
安定版は、2016年12月リリースの予定です。安定版では、Windowsもサポートされるようです。

Bazelのドキュメントを見てみると、AndroidやiOSなどのルール(定義)がたくさんあります。
プラットフォーム単位での対応が柔軟に進んでいるようです。
この辺は、マルチプラットフォームを意識したビルドツールを目指しているような感じですね。

また、公式サイトの404ページ、ビルドエラー風メッセージでオシャレ!ですね。
pic01

環境の構築

まずは、環境の構築から。
OSのサポートは、今のところMac OS X とLinux(ubuntu)のみ。
ubuntu環境を持っていないので、AWS上にインスタンスを作成しました。

Bazelのインストールマニュアルに沿って、インストールを進めます。

java実行環境のインストール

Bazelは、javaの実行環境1.8以上(1.7はまだサポートされてますが、非推奨)が必要なので、javaをインストールします。

インストールに必要なコマンドのインストール

Bazelモジュールをダウンロード

今回は、0.2.0を使用します。

実行権限をつけます。

インストール

インストールが完了すると、このようなメッセージが表示されます。

作業フォルダに、binフォルダが作成されます。中身はこのようになっています。

パスに~/binを追加します。

これで、環境構築は完了です。

動かしてみる

実際に動かしてみるために、簡単なプロジェクトを作成します。
Bazelの実行に必要なファイルは、以下の2ファイルです。
・BUILD
・WORKSPACE
BUILDには、コンパイルの詳細設定や、プロジェクト間の依存関係などを記載します。
WORKSPACEには、依存関係や外部ソースの参照などを記載します。

サンプルプロジェクトの構成です。

SampleRunner.java

BUILD

javaビルドのルール定義を記述しています。
nameはプロジェクト名
srcsはターゲットのソースファイルです。glob関数を使って、ワイルドカードを使用できます。
main_classには、メインクラスを指定します。
ルール定義の詳細はこちら

WORKSPACEは、今回は依存や外部ソースの参照が必要ないので、空ファイルで問題ありません。

ビルドするには、下記コマンドを実行します。

実行すると、結果がこのように出力されます。

実行後のディレクトリ構成を見てみると、このようになっています。

生成物を実行してみます。

生成物をクリアするには、cleanタスクを実行します。

Mavenリポジトリの依存関係を追加してみる

次に、Mavenリポジトリのライブラリの依存関係を設定してみます。

SampleRunner.javaを以下のように修正します。

commons-langのStringUtilsを使用して、bazelを大文字に変換する処理を追加します。

WORKSPACE

nameには、Bazelの内部で使用する名称を指定します。
注意が必要なのは、ここではハイフンは使用できません。ライブラリ名と同じcommons-lang を指定するとこのようなエラーになります。

BUILD

ここで、依存関係を追加します。
java_binaryルールで、depsにcommons_langを指定しています。
commons_langは、java_libraryルールで定義しています。
ここでは、ハイフンは使用できるようです。

ここまでできたら、ビルド、実行してみます。

無事動作しました。

最後に

はじめて触ってみた感触ですが、30分もあれば簡単な確認はできると思います。
ただ、Bazelの特色である、高速・柔軟性などを体感するには至っていません。
次回は巨大なプロジェクトをビルドして、Gradleとの比較をしてみたいと思います。

Comments are closed, but you can leave a trackback: Trackback URL.