GAE/Go(echo) + depでサンプルAPIサーバの作成
※注意:GAE/Goに関して古い情報がかなりあるので参考にしない(特に2016年のもの)
注意点
-
goapp serve, goapp deploy
は今はdev_appserver.py, gcloud app deploy
に置き換えて考える- gcloudコマンドへの移行
- ただし、gcloudはvendoringに対応していない(後述)
- 素直にvendoringを使いたいならgoappコマンドを使うのがよさそう
- パッケージマネジャーは公式が開発しているdepがよい(glideは使わない)
参照したドキュメント
GAE + Go
環境構築
使用した環境
- macOS High Sierra (10.13.6)
- fish shell
GOPATHの設定
config.fishにGOPATHの設定を書く
set -x GOPATH $HOME/go
goenv
goenvのインストール
goenvは複数のプロジェクトがあるが、brewでインストールできるものを入れる
> brew install goenv
config.fishに以下を追記しパスを通す
set -x GOENV_ROOT $HOME/.goenv
set -x PATH $GOENV_ROOT/shims $PATH
goenv rehash >/dev/null ^&1
コマンド
## インストールできるgoのバージョンリスト
> goenv install -l
## インストール
> goenv install 1.9.6 #gae goで対応している最新バージョン(2018/07/20)
## システム全体で使用するgoのバージョン設定
> goenv global 1.9.6
> go version #goのバージョンを確認
go version go1.9.6 darwin/amd64
## goenv helpでコマンド一覧を確認
> goenv --help
これでgoのバージョンを自由に設定できる
dep
npmのようなgoのパッケージマネジャー
depのインストール
> brew install dep
> brew upgrade dep
init
/go/src/gae-go-echo-tutorial直下で初期化するとGopkg.lock
とGopkg.toml
,vendor/
が作成される。
すでにgoのコードがあり、なんらかのパッケージがgoのコード内でimportされている場合は、それも見て依存関係のあるパッケージまでインストール&管理してくれる
バージョンもちゃんとロックしてくれることで、チーム内での環境構築がしやすい
> dep init
新しいパッケージのインストール
パッケージをgoのコード内でimportして
> dep ensure
でvendor以下にインストールされる
gcloud app deployでハマったこと
gcloud app deploy
コマンドはvendoringに対応していない(2018/07/20)
では、go getでパッケージ管理を行えばいいかというとそうでもなく、パッケージが依存しているパッケージでvondoringを利用している場合でもgcloud app deploy
コマンドで依存しているパッケージをimportできませんとエラーが出る。
例えば、echoをdepを使わずにgo getでインストールしてデプロイしようとしたが、echoが依存しているパッケージがvendoringを利用しているのでエラーが出てdeployできない(devapp_server.pyでローカルサーバーはエラーなく立ち上がる)
ERROR: (gcloud.app.deploy) Error Response: [9] Deployment contains files that cannot be compiled: Compile failed:
/work_dir/github.com/valyala/fasttemplate/template.go:12:2: can't find import: "github.com/valyala/bytebufferpool"
なので、vendoringをしつつ、gcloud app deploy
を行うために以下のディレクトリ構成にした。
deployコマンドを打つときに$GOPATHをsrcからvendor以下にsymlinkが貼られているgopath/
に変更することでgcloud app deploy
でもデプロイするこができるようになる。
## GOPATHをgopathに設定する
## この辺はよしなにaliasを貼るとか、Makefileを使う
> set -x GOPATH $HOME/go/src/gae-go-echo-tutorial/gopath
ディレクトリ構成
.
├── Gopkg.lock
├── Gopkg.toml
├── README.md
├── backend
│ ├── app-engine.go
│ ├── app-standalone.go
│ ├── app.go
│ ├── app.yaml
│ ├── public
│ │ └── index.html
│ └── users.go
├── gopath
│ └── src -> ../vendor
└── vendor
├── github.com
│
└── golang.org
GOPATHをsymlinkを貼っているgopathにしないと出るエラー...
ERROR: (gcloud.app.deploy) Error Response: [9] Deployment contains files that cannot be compiled: Compile failed:
/work_dir/app-engine.go:6:2: can't find import: "github.com/labstack/echo"
/work_dir/gae-go-echo-tutorial/vendor/github.com/valyala/fasttemplate/template.go:12:2: can't find import: "github.com/valyala/bytebufferpool"
/work_dir/gae-go-echo-tutorial/vendor/github.com/labstack/gommon/color/color.go:9:2: can't find import: "github.com/mattn/go-colorable"
/work_dir/gae-go-echo-tutorial/vendor/github.com/mattn/go-colorable/colorable_appengine.go:9:2: can't find import: "github.com/mattn/go-isatty"
/work_dir/gae-go-echo-tutorial/vendor/github.com/labstack/gommon/log/log.go:15:2: can't find import: "github.com/mattn/go-isatty"
/work_dir/gae-go-echo-tutorial/vendor/github.com/labstack/echo/middleware/basic_auth.go:8:2: can't find import: "github.com/labstack/echo"
/work_dir/gae-go-echo-tutorial/vendor/golang.org/x/crypto/acme/autocert/autocert.go:34:2: can't find import: "golang.org/x/crypto/acme"
/work_dir/gae-go-echo-tutorial/vendor/github.com/labstack/echo/echo.go:57:2: can't find import: "github.com/labstack/gommon/color"
これで、echoを使いつつ、gcloudコマンドでデプロイすることができた。
はやくvendoringに対応してほしい…