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公式が移行せよと言ってるっぽいので。

んでvendoringして、ローカルでは動いた。

(ポイント2)goapp servegoapp deployを使っていたが、これはdev_appserver.pygcloud 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ディレクトリはハマりポイントらしく、こう解決してみた、というエントリがいくつかある。

app.yamlnobuild\_files書くのはなんかやだったし、gb入れるのもデカすぎなので、僕はこうした。

以下のようなディレクトリ構成をとって、gopath/srcvendorへのシンボリックリンクとし、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で将来なにかハマりそうなくらいで、だいたいのハマりポイントは抜けた感じする。ハマったら随時追記しよ。