Google App EngineのGo 1.8 Standard envでdepのvendoringなどでハマる(2017年10月現在)
Google App EngineのGo 1.8 Standard environmentを使って、React SPAのWebサイトを作ろうと考えた。
Reactのサーバサイドレンダリングとか、欲しいものが入ってるgo-starter-kitというよいサンプルがあるので、これを参考にした。
(ポイント1)ただし、goのvendoringでglideを使うのはやめて、depを使うことにした。glide公式が移行せよと言ってるっぽいので。
- Glide から Dep への移行を検討する
んでvendoringして、ローカルでは動いた。
(ポイント2)goapp serve
とgoapp deploy
を使っていたが、これはdev_appserver.py
とgcloud app deploy
に変えたほうがいいらしい。
(ポイント3)だが、ファイル編集での自動再コンパイルがうまく動かない。どうやら、Mac環境で$GOPATH以下に10,000個ファイルがあるとgoogle/appengine/tools/devappserver2/mtime_file_watcher.py
の中で制限にひっかかってしまう。
ghqを使っていて、.gitconfigには
[ghq]
root = ~/dev/src
と書いており、$GOPATHも$HOME/devで、go以外の言語のプロジェクトもいっぱい突っ込んでいる。ので、$GOPATH配下に10,000ファイルを超えるのは避けがたい。
Linux環境でgoogle/appengine/tools/devappserver2/inotify_file_watcher.py
を使えば10,000ファイルでも平気なのかもしれないが、なるべくMacでVMなしでやりたいなあ。
でググったら、mtime_file_watcher.pyをいじる例がちらほら。えー直接いじりたくないよう。
と思ったら、dev_appserver.py
に--enable_watching_go_path
というオプションを発見。最近できたっぽい。configure
みたいに--disable_watching_go_path
も通るかと思いきやダメだったので、普通にdev_appserver.py --enable_watching_go_path false
と動かすようにして解決。
(ポイント4)gcloud app deploy
もうまく動かない。Go App Engineとvendor
ディレクトリはハマりポイントらしく、こう解決してみた、というエントリがいくつかある。
- Google App EngineでGoを動かすときに知っておくべきこと(ソースコード・ビルド編)
- 実践的なGAE/Goの構成について #golang #gcpja
- GAE/Go の勘どころ
- AppEngine for Go でのVendoring
app.yaml
にnobuild\_files
書くのはなんかやだったし、gb入れるのもデカすぎなので、僕はこうした。
以下のようなディレクトリ構成をとって、gopath/src
をvendor
へのシンボリックリンクとし、GOPATH=`pwd`/gopath gcloud app deploy
として、デプロイのときだけ$GOPATHをgopath
にするようにした。ダサい。だが動いたぞ。
$GOPATH/src/github.com/gunyarakun/oreore-project
├── Gopkg.lock
├── Gopkg.toml
├── backend
│ ├── app.go
│ ├── app.yaml
├── gopath
│ └── src -> ../vendor
└── vendor
├── github.com
│ └── ...
└── google.golang.org
└── appengine
google.golang.org/appengineをvendoringするのは意見分かれるところもあるが、ぼくは入れた。
フレームワークはechoを使ったが、バージョン間の差異がけっこう大きい。ググったヤツは参考にせずに、公式ドキュメントとソースを見るとよい。
あとは、Google Cloud Datastoreで将来なにかハマりそうなくらいで、だいたいのハマりポイントは抜けた感じする。ハマったら随時追記しよ。