
Gradle, Maven, Antの違い
■ ビルドツールとはなにか
ソースコードファイルを独立したソフトウェア生成物に変換するコンピュータ上で実行されるプロセス、またはその結果のこと。ビルド (ソフトウェア)を参照。
wikipediaより
ビルドツールとは、実世界で例えると自動梱包システムである。たとえば自動梱包システムでは、商品の検品、箱詰め、セット商品の管理、数量管理、届け先の紐付け、出荷依頼の一連の流れ作業をすべて自動で行う夢のシステムとする。ビルドツールとはこのように、「出荷前に不可欠である面倒なルーティーン作業」を自動化してくれる素晴らしいシステムである。
■ 動機
ビルドツールについて人に説明する機会があり、その際に説明に困ったので私の思考を整理し、共有する意味で投稿する。この投稿ではビルドツールの具体的な記述法については説明せず、概要と各ツールの紹介までに留めておく。この投稿の目的はビルドツールの概要とその必要性について理解してもらうことである。
■ ビルドツールを採用するメリット
ビルドツールは現代社会において絶対不可欠な存在である。
ビルドツールは個人で行うアプリケーション開発などにおいては絶対不可欠な存在とはいえないが、現代のIT社会の中で優位性を発揮するアプリケーションの開発現場には絶対に必要不可欠な存在であり、表現はやや飛躍するが現在のIT社会はビルドツールなしでは機能しないまで依存している。様々な恩恵が得られるが故にほぼすべての開発現場で利用されているだろう。この章ではビルドツールを採用するメリデリを整理する。
・ビルドツールを採用するメリット
1. 効率化
・ビルドの手順が毎回同じであるならすべてプログラムにまかせてしまうことで、手作業に比べ作業時間が短縮される。
・ビルドの設定ファイルはチームで使いまわしできるので、チーム客員がそれぞれの作業に集中できる
2. エラーの撲滅
・手作業でのビルドに比べ、手順が固定化されるためヒューマンエラーを撲滅できる。ツールにプログラムした手順に誤りがあった場合はエラーになるが、それは手動でも起こり得る上、手動の方が起こる頻度が高いため、ここについてもビルドツールの採用に分がある。
・ビルドツールを採用するデメリット
1. 学習コスト
・プログラムが十人十色であるように、それをビルドする設定も十人十色である。そのため作成したアプリケーションに最適な設定はコピペでは不可能であるため、独自の設定ファイルを作成せざるを得ない。従って少なからずの学習コストは発生する。
デメリットはあるが、100時間も開発していれば優に回収できるコストであるため、実際のビジネス現場において学習しないのはもったいなさ過ぎる。エンジニアたるもの楽のために労を惜しむべからず。
■ もしビルドを手作業で行うなら
仮にもし、ビルドツールが存在しない世界線ではどのように出荷前作業が行われているか紹介する。以下はQiitaより引用である。
1. コンパイル:
プログラミング言語を用いて書いたプログラムをバイトコードに変換すること.スクリプト言語なら不要.
2. 依存ライブラリの解決:
プロダクトが利用しているライブラリを用意すること.コンパイル時にライブラリが必要だったり,出荷するアプリケーションにライブラリを含める必要があるからです.
3. 静的解析:
ソースコードのスタイルが正確か,潜在バグを含んでいる可能性の高い記述をしていないかを確認すること.
4. テスト:
テストコードを実行してテスト結果を確認すること.(普通,失敗したらここで終了.)
5. 設定ファイル解決:
アプリケーションを動かす環境ごとに異なる設定 (使うポート番号とか,接続する DB 情報とか) を記述したファイルのうち,適切なものを選ぶこと.
6. パッケージング:
複数のバイトコードファイルを,1つまたは複数のファイルにまとめること.Java なら jar ファイルとか war ファイルにしたり,更にインフラの用いるスクリプトなどと併せて zip ファイルや tar.gz ファイルにまとめてしまうこともある.
7. リリース(デプロイ):
上記までの手順でまとめたファイルを実際に動作させる環境に配置して起動すること.
https://qiita.com/Mura-Mi/items/225825cc3715dc04d923
すべての作業が必須とはいい切れないが、それでもこれだけの工程があり、またそれぞれの工程において更に学習が必要である。また手作業で行うが故に各工程においてヒューマンエラーの可能生が蓄積される。ビルドツールがどれほど偉大なプログラムであるか、その一端を理解していただけたら幸いである。
■ 現役ビルドツールをいくつか紹介
・ Ant(アント)
- Apache Ant
- Java用のビルドツール
- 設定ファイル名 : build.xml
- 2000年頃に流行したが現在は下火
- Eclipseの標準ビルドツール
- ライブラリの依存関係解決機能を持っていない
- 設定ファイルが肥大化しやすい
・ Maven(メーベン)
- Apache Maven
- Java用のビルドツール
- 設定ファイル名 : pom.xml
- Antの後継ツール
- 2010年頃に流行し現在ではいい意味で枯れた技術
- POMとはProject Od Modelの略で設計思想である
- プラグイン拡張可能
- 設定ファイルの記述が簡単
- ライブラリ依存関係解決機能を持っている
・ Gradle(グレードル)
- 正式名もGradle
- Java, Kotlin用のビルドツール
- 設定ファイル名 : build.gradle
- Ant, Mavenをリスペクトしている
- バックエンド2020年現在のデファクトスタンダード
- ライブラリ依存関係解決機能を持っている
- ビルドファイル記法がxmlではなくGroovy言語を採用しているため、動的(テクニカル)な設定が記述可能
- 学習コストが必要
- Android Studioの標準ビルドツール
おまけ
・ Webpack(ウェブパック)
- JavaScript, TypeScript用のバンドルツール
- よく、ビルドツールと間違えられるが公式にはバンドルツール
- 設定ファイル名 : webpack.config.js
- Ant, Maven, Gradleとは住んでいる世界線が全く違う
- 世界線は違えどソースコード類を単一の実行形式ファイルに束ねようとする本質的役割は同じである
- ビルドファイル記法にJavaScriptを採用している
- フロントエンド2020年現在のデファクトスタンダード
■ まとめ
ビルドツールとはなにか、どんな役割を持ちなぜ必要とされているのかが概要レベルで理解していただけただろう。またもし、読者がプログラミング学習をするなら、ビルドツールを学習することで学習効率が飛躍するため、そういう意味でもおすすめである。
また、もしフロントエンドの方にGradleとはなにかを聞かれたら「webpackみたいに何でもやってくれるいい感じのやつ」と伝えれば伝わる。(保証はしない)