LoginSignup
7
4

More than 5 years have passed since last update.

GAE/Go(echo) + depでサンプルAPIサーバを作成してデプロイするまで

Last updated at Posted at 2018-08-04

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のバージョンを自由に設定できる

syndbg/goenv

dep

npmのようなgoのパッケージマネジャー

golang/dep

depのインストール

> brew install dep
> brew upgrade dep

init

/go/src/gae-go-echo-tutorial直下で初期化するとGopkg.lockGopkg.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に対応してほしい…

解決するために参考にした記事

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4