この前の月曜日(2015/10/5)、Gradle2.8-rc1が出たわけですが、InfoQではbazelが云々という記事が出ており、世間的にはbazelが一躍有名になったのですが、試してみたよ的なブログなかったので(あるにはあるけど、一つだけだったし、bazelのビルドから入ってるから記事が長い)、とりあえずGoogleのプロダクトに疎い僕が書くことにしました。とはいっても、まだ10分さわっただけだし、Getting Startedのほんの一部しかさわっていませんので、ここがいいよ、ここがイマイチだよというのはわかりません。
インストール
bazelのページにあるinstallingを参考に、bazelのタグ0.1.0からインストール用のシェルスクリプトがダウンロードできるのでそれをダウンロードして、実行します。
面倒だったし、自分のhomeディレクトリーがすでにかなり汚かったので、dockerイメージでやることにしました。僕が作ったdockerイメージはDocker Hubから入手できます。
ディレクトリー構成
WORKSPACEファイル
まず、WORKSPACEというファイルがプロジェクトディレクトリーの直下に必要だそうです。ここにはプロジェクトのdependencyを記述するそうなのですが、getting startedレベルではこのファイルに何かを記述得する必要はなさそうです。
BUILDファイル
次にBUILDというファイルもプロジェクトディレクトリーの直下に必要です。これにはどのコンパイル対象のファイル指定、依存プロジェクト、MANIFEST.MFの記述などができるようです。
まずは、こんな感じの記述をしました。
java_binary(
name = "tutorial",
srcs = glob(["src/main/**/*.java"]),
main_class = "com.example.ProjectRunner",
)
もろにgetting startedのコピーです。タスクなどはConventionで決まっているようですので、タスク定義までは必要ないようですが、ソースの位置の指定などはantっぽい感じです。
Javaのコード
実際のJavaコードはお好きな位置に配置します。僕はGradle/Mavenに慣れているので、src/main/javaの下に配置しました。
というわけで、こんな感じのディレクトリー構造になっています(とはいえ、これもgetting startedに書いてあるレベル)。
~/bazel-projects/sample/tutorial/
├── BUILD
├── WORKSPACE
└── src
└── main
└── java
└── com
└── example
├── Greeting.java
└── ProjectRunner.java
Greeting.javaとかProjectRunner.javaとかはコピペ…
bazelマシーンの起動
dockerを使って、bazelがインストールされたコンテナを起動します。
docker run -i -t -v ~/bazel-projects/sample/tutorial/:/home/bazel/tutorial mikeneck/bazel
-vオプションで自分のローカルにあるディレクトリーをコンテナ内にのっけて、そこでbazelを起動させます。
bazelでビルド
上記の通り-itオプションを付与しているので、その後のターミナルの操作によってbazelを起動します。
$ cd tutorial $ bazel build //:tutorial Extracting Bazel installation... ............. INFO: Found 1 target... Target //:tutorial up-to-date: bazel-bin/tutorial.jar bazel-bin/tutorial INFO: Elapsed time: 8.674s, Critical Path: 3.85s
ファイルが2つしかないので、コンパイル時間は非常に短いです。もう少し分量のあるプロジェクトをビルドしてみたほうが良さそうですね…
bazelで作成したjarの実行
bazel-binというシンボリックリンク先のディレクトリーにBUILDファイルのnameと同じ名前の実行ファイルがありますので、それを起動します。
$ bazel-bin/tutorial Hi!
bazelが作成したファイル群
bazelで作成したファイルは$HOME/.cacheというディレクトリーに作成されます。
$ ls -la total 28 drwxr-xr-x 1 bazel staff 340 Oct 11 13:49 . drwxr-xr-x 7 bazel build 4096 Oct 11 13:49 .. -rw-r--r-- 1 bazel staff 115 Oct 11 13:45 BUILD -rw-r--r-- 1 bazel staff 0 Oct 11 13:43 WORKSPACE lrwxr-xr-x 1 bazel staff 115 Oct 11 13:49 bazel-bin -> /home/bazel/.cache/bazel/_bazel_bazel/9323d0abc72376d0e1bc847951c6e4b3/tutorial/bazel-out/local_linux-fastbuild/bin lrwxr-xr-x 1 bazel staff 120 Oct 11 13:49 bazel-genfiles -> /home/bazel/.cache/bazel/_bazel_bazel/9323d0abc72376d0e1bc847951c6e4b3/tutorial/bazel-out/local_linux-fastbuild/genfiles lrwxr-xr-x 1 bazel staff 89 Oct 11 13:49 bazel-out -> /home/bazel/.cache/bazel/_bazel_bazel/9323d0abc72376d0e1bc847951c6e4b3/tutorial/bazel-out lrwxr-xr-x 1 bazel staff 120 Oct 11 13:49 bazel-testlogs -> /home/bazel/.cache/bazel/_bazel_bazel/9323d0abc72376d0e1bc847951c6e4b3/tutorial/bazel-out/local_linux-fastbuild/testlogs lrwxr-xr-x 1 bazel staff 79 Oct 11 13:49 bazel-tutorial -> /home/bazel/.cache/bazel/_bazel_bazel/9323d0abc72376d0e1bc847951c6e4b3/tutorial drwxr-xr-x 1 bazel staff 102 Oct 11 13:39 src
-vオプションで$HOME/.cacheにはmacのディレクトリーをリンクさせていないので詰んだ(´・ω・`)
あと、local_linux-fastbuildという名前のディレクトリーがあるので、ひょっとしたらプラットフォームに依存するのかもしれません。とはいえ、-vオプションでリンクさせる実験はやってないので、dockerのコンテナでビルドしたものをmacで実行できるかどうかの確認はやりませんでした。10分間だけだったので…
以上、getting startedの3分の1だけ試してみたよという記事でした。