Go
GoogleAppEngine
cloud9
GoogleCloudPlatform
More than 1 year has passed since last update.

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を追加しておく

.bashrc
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を追加する

init.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.yamlmain.goを作成する

app.yaml
runtime: go
api_version: go1

handlers:
  - url: /.*
    script: _go_app
    secure: always
main.go
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で環境構築したら負けかなと思ったので一応使えるかなというところまでは作ってみました。