mike-neckのブログ

Java or Groovy or Swift or Golang

bazelを10分だけさわってJavaプロジェクトをビルドしてみた

この前の月曜日(2015/10/5)、Gradle2.8-rc1が出たわけですが、InfoQではbazelが云々という記事が出ており、世間的にはbazelが一躍有名になったのですが、試してみたよ的なブログなかったので(あるにはあるけど、一つだけだったし、bazelのビルドから入ってるから記事が長い)、とりあえずGoogleのプロダクトに疎い僕が書くことにしました。とはいっても、まだ10分さわっただけだし、Getting Startedのほんの一部しかさわっていませんので、ここがいいよ、ここがイマイチだよというのはわかりません。


インストール

bazelのページにあるinstallingを参考に、bazelのタグ0.1.0からインストール用のシェルスクリプトがダウンロードできるのでそれをダウンロードして、実行します。

github.com

面倒だったし、自分の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だけ試してみたよという記事でした。