結論としては、Bazel、Gradleに比べれば圧倒的に低い学習コストでmakeより現代的なビルドツールとして筋は悪くない印象。 現代的と感じた機能
- DSLのベースがDockerfile + Makefileなのでかなりとっつきやすい
- ビルド環境がホストマシンから隔離されている(dockerの中でビルドすることで実現している)
- それでありながらビルドしたファイルをホストマシンにコピーするのもとても簡単
- Dockerイメージの書き出しにネイティブで対応している
- ビルド自体をdockerの中で行っているので、ビルド後の状態をそのままイメージとして書き出すだけで実現できてる
- BazelはDockerイメージを生成するためにまた別のプラグイン的なものを導入する必要があるのに比べると雲泥の学習コスト
- dockerのlayer cacheの仕組みをビルドキャッシュとして活用している
- どういう場合にキャッシュが再利用できるのか、破棄されるのかの仕組みがDockerfileと一緒なので非常にわかりやすい
- dockerイメージをリモートキャッシュとして活用している
- ビルドキャッシュ=dockerイメージをdockerレジストリにpushできる
- CI環境やチームメイトがビルドするときにはpushされたイメージをリモートキャッシュとして活用できる
- Bazel、Gradleはリモートキャッシュ機能を使うためにS3やGCSのセットアップ、認証が必要だったのに対してdockerのレジストリで済むので楽
全体的に好印象なツールだったが、そもそも個人開発OSSの規模だとビルド環境をホストマシンから完全に隔離したいとか、キャッシュを効かせないとビルドにものすごい時間がかかるなどの問題がないので旨味が少ない。 逆に、monorepoでチーム開発をしていてMakefileが必要な規模のビルドの複雑さ、ローカルのビルドとdocker buildで2重にビルド時間がかかっているなどの問題がある場合には向いているツールかもしれない。
せっかく試したので、自分のOSSのDockerfileとほぼ等価な結果になるEarthfileまで作ったので供養として置いておきます。