2012年3月29日木曜日

Google App Engine Go SDK 1.6.4を使おうと思ったものの…。

今日の早朝(1:00頃)Go Ver 1のリリースと、
Google App Engine Go SDK 1.6.4がリリースされたので、
変更点をまとめようかと思ったのですが、go1beta4を利用していると
あまり大きな変更点はないので、変更点を洗い出すよりは、開発の手順を
まとめてみようと思います。

とりあえず、ネタを考えるのが面倒だったので
Slim3のチュートリアルと同じ事をGAE/G 1.6.4で実現できるかどうかを
試しつつ進めていこうと思います。

  1. コントローラとテストの作成
事前に、プロジェクトのディレクトリを作成して下さい。
$ cd [任意のディレクトリ]
$ mkdir twitter
$ cd twitter

Slim3のように、build.xmlなんて、便利なものは存在しませんので、手で作成します。

app.yaml
application: twitter
version: 1
runtime: go
api_version: go1

handlers:
- url: /favicon.ico
  static_files: favicon.ico
  upload: favicon.ico

- url: /.*
  script: _go_app

app.yamlの大きな変更点は、api_versionが"go1"になっている点です。
1.6.3までは、"3"で、go1betaは"go1beta"でした。
恐らく、古いバージョンはコンパイルエラーが発生して動かないと思いますので
古いバージョンのプログラムから持ってくる場合はチェックしましょう。

次に、controllerを作ります。
$ mkdir controller
$ cd controller

frontcontroller.goを作成します。このファイルが名前の通り、frontcontrollerとなります。

package controller

import (
 "fmt"
 "net/http"
)

func init() {
 http.HandleFunc("/twitter/", index)
}

func index(w http.ResponseWriter, r *http.Request) {
 htmlText := `
     <!DOCTYPE html>
     <html>
     <head>
     <title>Hello World</title>
     </head>
     <body>
         <p>Hello World</p>
     </body>
     </html>
     `
  
 fmt.Fprintf(w, "%s", htmlText)
}

では、実行します。
開発サーバはdev_appserver.pyを実行するだけなので、twitterディレクトリの1つ上の
ディレクトリで実行すると便利です。

$ python [SDKのディレクトリ]/dev_appserver.py --high_replication twitter

ブラウザで、http://localhost:8080/twitter/にアクセスして、Hello Worldが
表示されれば成功です。
--high_replicationのオプションはHRD環境をエミュレートするオプションです。
現時点でこのオプションを付ける必要は無いのですが、とりあえず入れておきます。

この後、デモでは、フォームの作成で、モデルの処理を作成して、テストコードを
作成してテストを動かしてテストして…と続くのですが、

Go言語標準のコマンド、go testが動作しないため、断念しました。
https://plus.google.com/u/0/114183076079015753160/posts/intFioopvTj

ドキュメントにも載っていないし、恐らく、現時点ではGAE/GのSDKでgo testを利用する事はできないのかもしれません。

ただ、GAE/Gにもtest用のモジュールが存在しているようで、
https://code.google.com/p/gae-go-testing/source/browse/appenginetesting/
これを利用したら良いのではないかと考えている最中です。

17:16:追記
gae-go-testingはだいぶ古そうです。試しにmake installしてみましたが、だめでした。
unit testについてはもう少し様子を見たほうが良さそうです。

もしくは、標準のGo言語のコンパイラをインストールしてGAEのAPIを動かさない
パッケージのみテストを行うという方法を取るしか今は無さそうです。