しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Web サイトで Martini を使ったアプリケーションを動かす

f:id:shiba-yan:20140929001204p:plain

Martini - Classy web development in Go.

Azure Web サイトで Go 言語を httpPlatformHandler を使って動かしてみた - しばやん雑記 にて Azure Web サイト上で Go 言語を動かすことが出来たので、今回は Martini というフレームワークを使ったアプリケーションを動かすことが出来るか調べました。

アプリケーションと言っても、Martini の公式サイトに載っているサンプルコードを動かしてみるレベルなので、README を見ながら作業をしていきます。

martini/README_ja_JP.md at master · go-martini/martini · GitHub

まずは Martini のインストールですが、前回は GOPATH の設定をしていなかったので D:\home 以下に go というディレクトリを作成して、そのパスを GOPATH に設定しておきました。

f:id:shiba-yan:20140929001438p:plain

GOPATH の設定が終われば、go get コマンドを使って Martini をインストールします。

go get github.com/go-martini/martini

何となく Visual Studio Online "Monaco" からコマンドを実行してみました。特に意味はないです。

f:id:shiba-yan:20140929001449p:plain

特に進捗の表示などもなく、無言で終わりました。

残りはポート番号の設定ぐらいなので、README に書いてある通りに環境変数 PORT に HTTP_PLATFORM_PORT の値を渡す設定を追加してみましたが、何故か go.exe が数秒で落ちてしまい起動しなくなる現象に遭遇しました。

LogFiles ディレクトリに出力されている httpPlatformStdout.txt ファイルに Martini のログが出力されるので調べてみると、ポート番号の後ろにスペースがたくさん付いていました。

[martini] listening on :12664                (development)
[martini] listen tcp: GetAddrInfoW: The specified class was not found.
exit status 1

これが原因でリッスンに失敗して、サーバーが終了していたようです。

仕方ないのでポート番号を PORT を使わずに HTTP_PLATFORM_PORT から直接取って、RunOnAddr メソッドに渡すように修正しました。

package main

import (
  "github.com/go-martini/martini"
  "os"
)

func main() {
  m := martini.Classic()
  m.Get("/", func() string {
    return "Hello Martini!"
  })
  m.RunOnAddr(":" + os.Getenv("HTTP_PLATFORM_PORT"))
}

これでサーバーが落ちることなく、正しくページが表示されるようになりました。

f:id:shiba-yan:20140929154453p:plain

もう一度 httpPlatformStdout.txt ファイルを開いてみると、今度は正常に処理が完了したというログが出力されていました。これで一応問題は回避できたようです。

[martini] Started GET / for xxx.xxx.xxx.xxx:9676, xxx.xxx.xxx.xxx:9676
[martini] Completed 200 OK in 0
[martini] Started GET / for xxx.xxx.xxx.xxx:9676, xxx.xxx.xxx.xxx:9676
[martini] Completed 200 OK in 0
[martini] Started GET / for xxx.xxx.xxx.xxx:9676, xxx.xxx.xxx.xxx:9676
[martini] Completed 200 OK in 15.6314ms

httpPlatformHandler に関しては現在問い合わせ中ですが、環境変数の展開に問題がある気がします。