はじめに
Golang UK Conference 2017で紹介されていたGo製WebToolKit。日本ではまだまだ事例がなさそうなのと気になっていたのでREADMEと公式ドキュメントを読んで概要をまとめた。ここでは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を使用するためGCCなどのCコンパイラが必要
install
$ go get -u github.com/gobuffalo/buffalo/buffalo
依存してるGo package
buffaloは車輪の再発明をせず、すでにGoコミュニティに存在する便利なpackageを利用してプロジェクトが成り立っている。
依存しているGo packageは巨人の肩に乗る
という事でSHOULDERS.mdとしてリストアップされているので目を通すと良い
主な特徴
- URLルーティング
- route, session, cookieなどはWebToolBoxであるgorriaを使用
- HTML Template
-
plushというテンプレートを使用。
html/template
を使用する事も可能
-
plushというテンプレートを使用。
- 便利なTOOLBOX(bufffaloコマンド)
- Test Suite
- ホットリロード
- フロントエンドパイプライン(option)
- webpackを使用
- Models/ORM(option)
- popを使用
- タスクランナー(option)
- 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
- go標準の
html/template
より扱いやすいため採用した模様
- routing
- github.com/gorilla/mux
- 安定性と使いやすさのために選んだとの事
- タスクランナー(option)
- github.com/markbates/grift
- GriftはRailsのRakeに影響を受けている。griftではデータベースをシードするタスクや、CSVからデータベースレコードを生成するタスクなどに向いている
- ORM(option)
- session, cookie, websocket...
所感
RevelのようなフルスタックなWebフレームワークと思ったが内容を追っているとpackageを上手に組み合わせてプロジェクトを構築しているという印象。始めから大量のpackageを内包せずにオプションサポートしてるのでフルスタックという感じでもない。
gopher的にはミニマムな構成でのpackage群で頑張るカルチャーがあると思うが、例えばこれからWeb開発にGoを導入してみたいが既にあるpackageを使い楽をしたいというチームにはbuffaloは良いかも知れない。
Rails, Laravelとか使用していた人がGoでWeb開発する時に、取っつきやすさがあると思うので候補とするのはありだと思う。
実際にサンプルWebアプリケーションを作った記事は別のポストに書く予定です。