Cloud9でGAE/Goが開発したいということなので
自分で試してみたことのメモ
Cloud9 とは
https://c9.io
ブラウザでアプリケーションの開発ができるサービスということで
無料でも結構使えるらしい
前提
Cloud9のアカウントを取得して
プロジェクトはUbuntuをベースに作成
GAE/Go SDK のインストール
cd ~
とかでHOMEディレクトリに移動して以下のコマンドでささっとSDKをインストール
$ curl -s -o go_appengine.zip https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.37.zip
$ unzip -q go_appengine.zip
$ rm -f go_appengine.zip
https://gist.github.com/k2wanko/bd7707e481c13adddc577292a7a3dd20
一発でインストールするようのシェルスクリプト
bashrcにPATHを追加しておく
export PATH=$PATH:/home/ubuntu/go_appengine:$GOPATH/bin
Editorの設定
ExperimentalでGoのコード補完に対応しているので
それを有効にする
[Preferences]->[Experimental]->[Language]の[Go Code Completion]をオンにする
goimportsの設定
コード補完もそうだがGoの開発で必須と言ってもいいgoimportsも設定しておく
以下のコマンドでインストール
$ go get golang.org/x/tools/cmd/goimports
左上の[Cloud9]->[Open Your Init Script]でinit.jsを開いて
以下のJSを追加する
var path = require('path');
var execGoFmt = function execGoFmt(filepath) {
services.proc.execFile('bash', {
args: ['-c', 'goimports -w ' + path.join(services.c9.workspaceDir, filepath)]
}, function (e, a) {
console.log(e, a);
});
};
services.save.on('afterSave', function (e) {
if (e.path && e.path.endsWith('.go')) {
execGoFmt(e.path);
}
}, plugin);
services.format.on('format', function (e) {
if (e.mode !== 'golang') return;
var tab = e.editor.ace.session.c9doc.tab;
services.save.save(tab, {}, function () {
execGoFmt(tab.path);
});
return true;
}, plugin);
参考: https://community.c9.io/t/init-script-example/2528
保存したら左上の[Cloud9]->[Resatrt Workspace]で再起動しておく
これでgoを保存したらgoimportsでコードフォーマットと依存パッケージを追加してくれるようになる。
本当はプラグインまで作ろうと思ったのだけどなんかめんどくさそうだったので
後回しにした。
Hello World
ここまで来たら後は動作確認
事前にgo get
で依存パッケージをインストールしておく
$ go get -u google.golang.org/appengine
app.yaml
とmain.go
を作成する
runtime: go
api_version: go1
handlers:
- url: /.*
script: _go_app
secure: always
package main
import (
"fmt"
"net/http"
"google.golang.org/appengine"
"google.golang.org/appengine/log"
"golang.org/x/net/context"
)
func init() {
http.HandleFunc("/", handle)
}
func handle(w http.ResponseWriter, r *http.Request) {
ctx := newContext(r)
log.Infof(ctx, "Index")
fmt.Fprintf(w, "ok")
}
func newContext(r *http.Request) context.Context {
return appengine.NewContext(r)
}
参考: https://cloud.google.com/appengine/docs/go/
ローカルの環境ではgoapp serve
ですぐみれるようになるが
Cloud9では以下のコマンドで起動することでブラウザからでも見れるようになる。
$ dev_appserver.py --skip_sdk_update_check true --host $IP --port $PORT --admin_host $IP --admin_port 8081 .
※.
はapp.yamlの位置を指定、今回はカレントディレクトリにあるので.
Applicationは https://[ProjectID]-[UserName].c9users.io
にアクセス
管理画面は https://[ProjectID]-[UserName].c9users.io:8081
にあるのでCronとかDatastoreとかはここで中を確認できます
今回試してみたプロジェクトは以下なので ファイル構成とか確認に使ってください
https://ide.c9.io/k2wanko/gaegoexample
感想
こういうCloudIDEは初めて触ってみたのですが、勉強会とかでMacとかWindows使ってる人でも統一した環境を用意できるのでかなりいいと思いました
ちなみにターミナルでemacs開いてみたら普通に使えたのですが、emacsで環境構築したら負けかなと思ったので一応使えるかなというところまでは作ってみました。