ginを使ってwebアプリケーション作成
まず、ライブリロードのライブラリである gin を入れておく(webアプリケーションフレームワークとは異なる gin なので注意)
go install は、 go mod に依存関係を追加せずにモジュールをインストールする
この gin は、開発中に使うコマンドラインツールなので、go get ではなく go install を使う
code:sh
go install github.com/codegangsta/gin@latest
go.mod の初期化
code:sh
go mod init lgtmoon
gin web フレームワークをインストール
code:sh
go get -u github.com/gin-gonic/gin
最小限の実装
code:go
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/health", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "OK",
})
})
r.Run()
}
ただし、このままでは、サーバーを起動したままコードを修正しても、コードが反映されない
そこで、 go run のかわりに、先程インストールした codegangsta/gin を使うのだが、
codegangsta/gin が環境変数で渡してくる PORT で HTTP を listen しないといけないという制約がある
codegangsta/gin コマンドを実行すると、codegangsta/gin が port 3000 で立ち上がり、 port 3000 にアクセスすると、 codegangsta/gin を介して、 main.go で立ち上がったサーバーにアクセスする(間に codegangsta/gin が入ることにより色々いい感じにしてくれる)
TODO codegangsta/gin のバイナリがどこにインストールされているのか、また、どう管理すればいいのか(リポジトリに含めるのかどうか)について書く
GOPATH/bin に codegangsta/gin のコマンドがインストールされるが、どうするのがいいのか
asdf を使っている場合の GOPATH の扱い
gin コマンドを叩くと gin-bin というキャッシュが生成されるので、これは gitignore とかで無視したほうがいいかも
コードを修正
code:go
package main
import (
"os"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
port := os.Getenv("PORT")
// 環境変数が設定されていない場合は空文字になる
if port == "" {
port = "8080"
}
r.GET("/health", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "OK",
})
})
r.Run("0.0.0.0:" + port)
}
main.go があるディレクトリで gin とすると gin が立ち上がり、 port 3000 でリクエストを受け付ける
裏で main.go が立ち上がって、通常であれば 3001 で受け付ける
port 3000 にアクセスすると gin 経由で main.go にアクセスできる