Go
GAE
GoogleAppEngine

GAE/Go (+dep) で gcloud app deploy する為の構成

Go1.11対応が入り go.mod が使えるようになりました!!🎉

参考情報

Structuring Web Services in App Engine

App Engine Standard Go 1.9 migration to Go 1.11

〜〜〜 以下、むかしむかし、辛かった時代のお話 〜〜〜

構成だけで解決するのは無理なので make deploy でシンボリックリンクを利用しデプロイ出来る $GOPATH を作った上で gcloud app deploy を叩く作戦


構成

./

├── Makefile
├── README.md
├── build
│   └── go ... デプロイ時の $GOPATH、make deploy 時にシンボリックリンクを貼る
│   └── src
│   ├── github.com -> ../../../go/src/lib/vendor/github.com
│   ├── golang.org -> ../../../go/src/lib/vendor/golang.org
│   └── lib
│ └── app -> ../../../../go/src/lib/app
├── devtools
├── gae ... GAE/Goのプロジェクトルート、デプロイ時の CWD
│   ├── admin
│   │   ├── admin.yaml
│   │   ├── init.go
│   │   ├── static
│   │   └── views
│   ├── app
│   │   ├── app.yaml
│   │   ├── cron.yaml
│   │   ├── init.go
│   │   ├── static
│   │   └── views
│   ├── dispatch.yaml
│   ├── var
│   └── worker
│   ├── init.go
│   └── worker.yaml
└── go ... IDE起動時やdev_appserver.py 時の $GOPATH
└── src
└── lib
├── Gopkg.lock
├── Gopkg.toml
├── app
└── vendor


Makefile

PROJECT_NAME="gaego-template-sample"

create:
gcloud app create --project $(PROJECT_NAME)

init:
cd go/src/lib; GOPATH=$(abspath go) dep init -v

install:
cd go/src/lib; GOPATH=$(abspath go) dep ensure -v

update:
cd go/src/lib; GOPATH=$(abspath go) dep ensure -v -update

serve:
cd gae; GOPATH=$(abspath go) dev_appserver.py \
--datastore_path=var/.datastore \
dispatch.yaml app/app.yaml admin/admin.yaml worker/worker.yaml

deploy:
# 一旦クリーン
find build/go/src -type l -delete
# vendor配下になるディレクトリのシンボリックを作成
ls -1 go/src/lib/vendor | xargs -n 1 -I {} ln -s ../../../go/src/lib/vendor/{} build/go/src/{}
# ローカルパッケージのシンボリックを作成
ln -s ../../../../go/src/lib/app build/go/src/lib/app
cd gae; GOPATH=$(abspath build/go) gcloud app deploy --project $(PROJECT_NAME) --version 1 app/app.yaml

clean:
find build/go/src -type l -delete

https://issuetracker.google.com/issues/38449183#comment19

早くgo1.10のサポートと共にベンダリングもサポートされて欲しい


参考