概観からGoのWebFrameworkを選ぶ(2016/02)から1年半・・・

結論 is Revel

Go WebFrameworkでググると一番上に出ちゃいますね、結局続きかけてな記事でお恥ずかしい・・・
概観からGoのWebFrameworkを選ぶ(2016/02)

この記事から2年弱。結局今どういう状況かと、どう変化したかを書きます。

そもそも

小さなwebサービスの開発をGoで書きました。エンジニア3名くらい、週末や空いた時間を使って気軽にやっていました。みんなバックグラウンドが違うしハーフコミットだったので、好きに書いてました。

結論 is Revel is 特に問題ない

良かった点は
- RailsっぽいアーキテクチャとGoの厳しいルールが程よい
- サンプルがわかりやすい
- アップデートが頻繁

正直、そんなパフォーマンス要求されるサイトでもなかったので、ただ書きやすくて誰でもすぐコード書けそうな状況を作れれば良かったので、WebFrameworkの前提知識がメンバー内でそれなりにあって余裕があるならフルスタックなフレームワークで良かったと思います。

それでも紆余曲折はありました。

  • gorm か gorp?
  • structの使い方に悩む
  • パッケージ管理でinstallでよくビルド失敗 gom -> glide -> dep
  • go version管理でデプロイ失敗

- goの環境作るの面倒問題

etc...etc...

見てわかると思うんですが、正直Goじゃなくてそれを取り巻く
開発環境・ツール・インフラに実はツラミがありました。

開発環境

最初
- goenv
- gom
- go ver1.5.3
- revel ver0.15.0


- vagrant
- gvm
- dep
- go ver1.7
- revel ver0.18.0

です。revelが先日の2017-10-30に最新版が出て、As of Revel 0.15.0, Go 1.6+ is required になり、revel自体をパッケージ管理してないと、 go getするたびに最新版が入ってくる(tag/branch/commit指定とかできない)ので、goのバージョンあげないといけないんですよね・・・
revelのパッケージ管理もdepが推奨されるようになっているので、こちらも対応が必要でした。

「Macですぐ環境つくれたほうがいいし、goenvでローカルを汚さないようにしとけばええやろ!」とか甘いこと考えてたんですが、GO言語の1.6.3より前のバージョンを使っている人は MacOS Sierraにアップグレードしないほうがいい話とかあってですね。「そもそもMacでGo書くな」という啓示がありまして、諦めてVagrantで環境を用意しました。
Ansibleで最初デプロイとかをしていたので、これを作ることは容易でした。

revelのバージョンが上がったり、goのバージョンが変わったりで結構面倒なので、その度に別のVMを立てて検証してました。

デプロイ

Revel Deployment

- Build the app locally and copy it to the server.
- On the server, pull the updated code, build it, and run it.
- Use Heroku to manage deployment.

というのが書かれています。うちはさくらのVPSでサーバ管理しているので、特にいい手段もなく最初はAnsibleでデプロイしてました。
よくビルドで(特にgomで)コケていたので、面倒だったので、CircleCIに変更しました。
ただCircleCIでgoの環境作ってビルドすると結構重かったので、ビルド用のサーバ用意してそこでビルド、生成されたバイナリを本番にscpするというので解決してました。冗長だけどいいのです、1バイナリデプロイ(笑)です。

AWSだとBOXFUSEというサービスが、唯一サポートしているようです。
日本じゃあまり聞かないサービスですね。

それで今だとどうなのか?

201602

Framework Star リポジトリ見ての印象
Revel 6,337 サンプル・モージュール・クーロンもプロモページもあっていい感じ
beego 6,234 Sinatraを参考にしているのでさくっとAPI作るのには良さそう、Auto API documentsが気になる
Gin 5,425 すごく早いらしい、martiniの40倍早いらしい
martini 8,178 一番人気、名前もいいね。唯一日本語ドキュメントがある
goji 2,947 シンプル(小並感)
echo 2,976 Ginよりさらに早い。まだ若い感じする

201712

Framework Star リポジトリ見ての印象
Revel 9,137(+2,800) あんま伸びてないけど、最近もアップデートしたしちゃんとGoの最新機能を使っている印象
beego 13,198(+6,964) 説明ページも動画あったりリッチ、APIサーバを作るには良さげ
Gin 13,361(+7,936) 一番伸びたな、やっぱ一番早いからかな。
martini 9,795(+1,617) あの頃の大人気martiniがあんま伸びてない、2014年から更新されてないしな・・・
goji 3,344(+397) これも更新ない
echo 8,831(+5,855) v3.2.5まで来ているw、issueとプルリクたくさん上がっている。レビューしきれてなさそう
iris 8,361(new) 良さある、ベンチ早い

ということで、そこまでRevel伸びてないし、star数と更新頻度で見ればRevel/beego/Ginのどれかな気がしますね。webアプリケーション作るならRevel、APIサーバ作るならGin、はじめてGo触る人が多ければbeegoがいいかも。
いまだにWebでなんのフレームワーク使ってGoを触るかがもやもやしているので、この辺いい知見がある方がいればシェアいただければ幸いです。 :pray: