2017年7月1日土曜日

GAE環境下での Echoフレームワークのエラー

Echoフレームワークは、最近注目されている Go言語の高パフォーマンス・フレームワークです。シンプルかつ、意外とドキュメントも整備されており、メンテナンスも頻繁に行われているようです。

参考: https://echo.labstack.com/

GAE(Google App Engine)環境下で動作させるマニュアル(gcloudコマンド用では無いですが・・・)も整備されています。しかしサンプルを実際に動かしてみると、エラーで動作しません。初めは何だか良くわからなかったのですが、時間が掛かりましたが原因がわかり動作可能になりました。この件を記事にしてみます。

 GAE環境下でのペンドリングとデプロイ ← こちらも参照ください(違う方法で解決)
Echoのエラー
ローカル環境で、GAEテストサーバを動作させると、エラー次のエラーが表示されます。

テストサーバ実行コマンド(gcloudコマンド)

$ dev_appserver.py app.yaml

表示されるエラー

INFO     2017-06-30 18:16:29,531 admin_server.py:116] Starting admin server at: http://localhost:8000
ERROR    2017-06-30 18:16:31,076 go_runtime.py:184] Failed to build Go application: 
(Executed command: /Users/xxx/google-cloud-sdk/platform/google_appengine/goroot-1.6/bin/go-app-builder -app_base ...省略... )
/Users/xxx/go/src/golang.org/x/crypto/acme/acme.go:18: can't find import: "context"

2017/06/30 18:16:31 Can't find package "context" in $GOPATH: cannot find package "context" in any of:
 /Users/xxx/google-cloud-sdk/platform/google_appengine/goroot-1.6/src/context (from $GOROOT)
 /Users/xxx/go/src/context (from $GOPATH)
2017/06/30 18:16:31 go-app-builder: build timing: 0×skip (2ms total), 5×compile (258ms total), 0×link (0 total)
2017/06/30 18:16:31 go-app-builder: failed running compile: exit status 2
エラー原因
エラーの原因はズバリ、Echo側にあります。GAEのSDKには、Go言語が内包されています。しかしこのGo言語は、バージョン1.6系なのです。しかし Echoの最新版では、バージョン1.6系のサポートが外れました。このため、エラーが出て動作しないようです。

Echoのサポートが外れたのは、バージョン3.20 からです。しかしその前のバージョンも、GAEに関しては問題が発生して動作しません。結局、バージョン3.02まで遡らないと動作はしないようです。

参考
gaeをechoで動かそうとすると
https://github.com/labstack/echo/releases

エラー対策

まずEchoのインストールを行います。

$ go get -u github.com/labstack/echo/...

Echo のインストール・ディレクトリ(例 /Users/xxx/go/src/github.com/labstack/echo 等)に移動し、タグ一覧を参照します。

$ git tag -l
2.0.0-alpha
v0.0.10
...省略...
v3.0.1
v3.0.2
v3.0.3
v3.1.0
v3.1.0-rc.1
v3.2.0
v3.2.1

3.0.2にチェックアウトします。

$ git checkout -b 3.0.2 refs/tags/v3.0.2
Switched to a new branch '3.0.2'

ブランチ一覧を表示してみます。

$ git branch
* 3.0.2
  master
3.0.2 にブランチが移動したことが確認できます。

プロジェクトのディレクトリに戻り、GAEテストサーバが動作するか確認します。

$ dev_appserver.py app.yaml

参考: gitでタグをチェックアウトする。

ブランチした Echo を最新版に更新する
ブランチした Echo を元に戻し、最新版に更新するには次のようにします。

master にチェックアウトします。

$ git checkout master

作成した 3.0.2 ブランチを削除します。

$ git branch -d 3.0.2
Deleted branch 3.0.2 (was cd2530e).

オプション u を付けて再度、git getコマンドを実行します。

go get -u github.com/labstack/echo/...

参考: How to do “go get” on a specific tag of a github repository

最後に
以上で当面、EchoをGAEで使用できるようになりました。しかし依存ライブラリの管理を行う、Godep等のツールを導入し、プロジェクト毎にパッケージを管理した方が理に適っていると思います。この辺は色々難しそうなので、もう少し調べて記事にしたいと考えています。

参考: How to checkout a release with go get?