#ビルドツールとは
- デプロイまでにする作業は実際「要求された実行環境で動作できる形式にアプリケーションやライブラリを組み立てる」ことをしている、これをビルドという。※作業としてコンパイルとか外部ライブラリのリンクとか、静的解析とか、テストとか
- またビルドという言葉には広義的な意味で「定型的な作業を行うこと」という意味がある。今回は広義的な意味でなく上記の要求された環境で動作するよう組み立てる意味でビルドを使う。
#ビルドの進化の流れ
- 人力ビルド
- 大きなコードだとコンパイルや静的解析に時間かかるので、ジュニアなメンバにビルド作業させることが多かった
- リリースのたびに手作業でコマンド打っているのは、運用的にも品質的にもまずい。そのため2のビルドスクリプトへ
- ビルドスクリプト
- ビルド作業で実行するコマンドをシェルスクリプトやコマンドファイルにまとめて、それを叩く。
- しかし、コードのコンパイルはできてるのに、テストコード間違ってもっかいコードもコンパイルするとか無駄なので、ビルドスクリプトでは対応できない処理を3のビルドツールで解決
- ビルドツール
- ビルドスクリプトの処理を分割して、前の処理結果に応じて次の処理を実行するかをプログラムできるようにした。
- ライブラリの依存関係の管理。これに特化した「パッケージマネージャー」てのがある。javascriptのnpmやRubyのRubyGemsとか
- タスクのインプットとなるファイルを監視して、変更があったら自動的にタスクを実行する。GruntのwatchやGradleのcontinuous build
- 継続的インテグレーション(CI)※ここから4,5はビルドツールを使ったうえで、さらに品質高めたいみたいな場合
- 継続的にアプリケーションのビルドをして、自動テストを回し、常に出荷可能なアプリケーションをビルドし続けよう、というプラクティス。
- 継続的デリバリー、または継続的デプロイメント
- CIが細かく回ったら、常に最新のプロダクトを自動的にリリースできるような仕組みを作ることもできる。これを継続的デリバリーや継続的デプロイメントという。
#ビルドツール:いろんなビルドツールの紹介
-
GNU Make :ビルドツールの草分け。C C++のビルドで使える。
-
Ant
- 特徴
- javaむけ
- ビルドファイル名のデフォルトはbuild.xml
- メリット
- antもjavaでかいてるから、マルチプラットフォームでいける
- eclipseに標準なので、インクリメンタルビルド
- インクリメンタルビルド:変更部分だけのビルド
- デメリット
- xmlで記述なので、ビルドファイルの可読性が低い→Mavenでも変わらず、、Gradleで解決!
- 宣言的にビルドスクリプトを書くみたいで、スクリプト書きにくい→Mavenで解決?
- 特徴
-
Maven
- 特徴
- antにかわるもの!?
- pom.xmlでプロジェクト構造を定義
- ライブラリ依存解決!
- ライブラリ依存解決する意味でのMavenと、ビルドツールの意味でのMaven。どっちで文脈として使われてるか気をつける。※それくらいライブラリ依存解決に活躍してるとことか!、
- メリット
- ライブラリ依存管理と「セントラルリポジトリ」を編み出した
- プロジェクト構造に規約を持ち込むことで、antよりビルドスクリプトの記述がスッキリした。
- デメリット
- 以前、ビルドファイルがxml
- スクリプトはスッキリしてもやはり、宣言的で、規約に縛られて、書きにくい
- 特徴
-
Gradle
- 特徴
- これまでのビルドツールのいいとこどり
- ビルドスクリプト名のデフォルトはbuild.gradle
- c c++ object-c のサポートもある(Google Testing Frameworkてのを標準サポートしてる。)
- Google Testing Framework:c++のより良いテストができる
- Android Studioでデフォルト
- メリット
- xmlから解放、Groovyを使ってる
- Groovy scriptで記述してる?いまは省略、成長したら!
- Mavenリポジトリによるライブラリ依存解決が可能
- マルチプロジェクトサポート
- ビルドツール自体にプラグイン機構が組み込まれている。独自拡張ができる
- これまでのツールと違い、各開発者が自分の環境にツールのインストールをする必要が無くなった。Gradleはスタンダロンで動作可能な実行ファイルを簡単に配布可能。※外部からライブラリをダウンしなくてよい
- xmlから解放、Groovyを使ってる
- デメリット
- DSLの理解が必要
- DSL:domain specific language
- 特定の用途に特化した、コンピュータ言語。
- DSL:domain specific language
- 遅いらしい、Antと同じくらい
- DSLの理解が必要
- 特徴
-
Bazel
- 元Googleのツール、クックパッドプログで取り上げられ、注目されたらしい
-
Grunt
- javascriptむけ
- ビルドツールやりタスクランナーといわれる
- ビルドスクリプト名はGruntfile。JSONで記述する。
-
Gulp
- javascriptむけ
- Gruntの対抗
- Node.jsと相性いいみたい
-
SBT
- Scalaむけ
- ビルドスクリプト名はbuild.sbt
#まとめ