Go製WebToolKit Buffalo[概要編]


## はじめに
<img src="https://raw.githubusercontent.com/gobuffalo/buffalo/master/logo.svg?sanitize=true" width="360" style="max-width:100%;">

[Golang UK Conference 2017](https://www.youtube.com/watch?v=75NjCfLLftw)で紹介されていたGo製WebToolKit。日本ではまだまだ事例がなさそうなのと気になっていたので[README](https://github.com/gobuffalo/buffalo/blob/master/README.md)と[公式ドキュメント](https://gobuffalo.io/en)を読んで概要をまとめた。ここでは`Buffaloとは？`を理解できるよう書いていく

## 概要
BuffaloはGoのWebエコシステムに沿ってWebアプリケーション開発が出来るソフトウェア。Goを使って楽に素早くWeb開発できるように設計されている。
ここでエコシステムと言ってるのはBuffaloは大半の機能を独自で実装しているわけではなく、既存のpackageを利用して成り立っているからである。

Buffaloはフロントエンド（JavaScript、SCSSなど）からバックエンド（データベース、ルーティングなど）をWebプロジェクトに含めた状態で生成し起動する。生成したプロジェクトでは簡単にWebアプリケーション用APIの開発ができる。

Buffaloは単なるWebフレームワークではなく、高速にサービスを開発するための総合的な開発環境とプロジェクト構造を提供する。


ちょっと英語の翻訳が上手くできてないが、一言でまとめると「RailsやLaravelのようにCLIでプロジェクトを作成したり便利なライブラリを含んだWebフレームワークみたいなモノ」と理解してよいと思う。

## 開発環境要件
buffaloを動作させるには以下の環境構築が必要となるがフロントエンドやデータベースを使用しない場合は設定はオプション扱いとなる。

### 事前インストール

- Goの開発環境
- `$PATH`に`$GOPATH/bin`を通している
- Goversion 1.9.7以上

#### フロントエンドの環境(オプション)

- Node.js ver8以上
- yarnかnpmでwebpackをインストールしている

#### データベースの環境(オプション)
データベース(sqlite)を使用しない場合は設定不要
- SQLite3を使用する場合、[mattn/go-sqlite3](https://github.com/mattn/go-sqlite3)を使用するためGCCなどのCコンパイラが必要

## install
```
$ go get -u github.com/gobuffalo/buffalo/buffalo
```

## 依存してるGo package
buffaloは車輪の再発明をせず、すでにGoコミュニティに存在する便利なpackageを利用してプロジェクトが成り立っている。
依存しているGo packageは`巨人の肩に乗る`という事で[SHOULDERS.md](https://github.com/gobuffalo/buffalo/blob/master/SHOULDERS.md)としてリストアップされているので目を通すと良い

## 主な特徴
- URLルーティング
	- route, session, cookieなどはWebToolBoxである[gorria](https://github.com/gorilla)を使用
- HTML Template
	- [plush](https://github.com/gobuffalo/plush)というテンプレートを使用。`html/template`を使用する事も可能
- 便利なTOOLBOX(bufffaloコマンド)
- Test Suite
- ホットリロード
- フロントエンドパイプライン(option)
	- webpackを使用
- Models/ORM(option)
	- [pop](https://github.com/gobuffalo/pop)を使用
- タスクランナー(option)
	- [grift](https://github.com/markbates/grift)を使用

### buffaloコマンド

#### プロジェクトの作成

```
$ buffalo new <name>
```

#### [開発時]Webアプリケーションの実行
開発時はホットリロードがサポートされている。`buffalo dev`コマンドで`.go`、`.html`を監視しファイル更新時にはホットリロードが実行される。リロードと表現しているが内部的には`go build`と`webpack watch`を実行している。

```
$ buffalo dev
```

#### [本番環境]Webアプリケーションの実行
本番環境ではgoビルドしたバイナリを実行する

#### ユニットテスト
`buffalo test`コマンドを実行すると、./vendorディレクトリをスキップしてtestコードを実行できる。depやglideを使用してpackage管理している場合はvendorディレクトリのテストは自動でスキップされる。

```
$ buffalo test
```

## 依存しているパッケージ達
READMEでは`Shoulders of Giants(巨人の肩に乗る)`と表現され、車輪の再発明はせずにすでに存在するpackageに依存している。

- template
    - [github.com/gobuffalo/plush](https://github.com/gobuffalo/plush)
    - go標準の`html/template`より扱いやすいため採用した模様
- routing
    - [github.com/gorilla/mux](https://github.com/gorilla/mux)
    - 安定性と使いやすさのために選んだとの事
- タスクランナー(option)
    - [github.com/markbates/grift](https://github.com/markbates/grift)
    - GriftはRailsのRakeに影響を受けている。griftではデータベースをシードするタスクや、CSVからデータベースレコードを生成するタスクなどに向いている
- ORM(option)
    - [github.com/gobuffalo/pop](https://github.com/gobuffalo/pop)
- session, cookie, websocket...
    - [github.com/gorilla](https://github.com/gorilla)

## 所感
RevelのようなフルスタックなWebフレームワークと思ったが内容を追っているとpackageを上手に組み合わせてプロジェクトを構築しているという印象。始めから大量のpackageを内包せずにオプションサポートしてるのでフルスタックという感じでもない。

gopher的にはミニマムな構成でのpackage群で頑張るカルチャーがあると思うが、例えばこれからWeb開発にGoを導入してみたいが既にあるpackageを使い楽をしたいというチームにはbuffaloは良いかも知れない。

Rails, Laravelとか使用していた人がGoでWeb開発する時に、取っつきやすさがあると思うので候補とするのはありだと思う。

実際にサンプルWebアプリケーションを作った記事は別のポストに書く予定です。