Golang + Gin にて css や js などの静的ファイルを読み込む

なるべく必要最低限のファイル数、
実際に書くような構成で実装してみた。

ファイル構成

main.go

/app
  ├ infrastructure
  │  ├ Config.go
  │  └ Routing.go
  │
  └ interfaces
     └ presenters
        └ index.tmpl
/assets
  ├ css
  │  └ style.css
  │
  └ js
     └ script.js

サンプルコード

main.go

package main

import (
	"github.com/psychedelicnekopunch/xxxxx/app/infrastructure"
)

func main() {
	r := infrastructure.NewRouting()
	r.Run()
}

/app/infrastructure/Config.go

色んな記事でテンプレートや静的ファイル場所を相対パスで指定していた。
supervisor でデーモン化した時に絶対パスじゃないとちゃんと動かなかったので、
Config.go でパス指定できるようにした。

package infrastructure

type Config struct {
	AbsolutePath string
}

func NewConfig() *Config {
	c := new(Config)
	c.AbsolutePath = "/var/www/html/psychedelicnekopunch/xxxxx"
	return c
}

/app/infrastructure/Routing.go

package infrastructure

import (
	"html/template"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/microcosm-cc/bluemonday"
	"gopkg.in/russross/blackfriday.v2"
)

type Routing struct {
	AbsolutePath string
}

func NewRouting() *Routing {
	c := NewConfig()
	r := &Routing{
		AbsolutePath: c.AbsolutePath,
	}
	r.loadTemplates()
	r.setRouting()
	return r
}

func (r *Routing) loadTemplates() {
	r.Gin.Static("/css", r.AbsolutePath + "/assets/css")
	r.Gin.Static("/js", r.AbsolutePath + "/assets/js")
	r.Gin.LoadHTMLFiles(
		r.AbsolutePath + "/app/interfaces/presenters/index.tmpl",
	)
}

func (r *Routing) setRouting() {
	r.Gin.GET("/", func (c *gin.Context) {
		c.HTML(http.StatusOK, "index.tmpl", nil)
	})
}

func (r *Routing) Run() {
	r.Gin.Run(":8180")
}

/app/interfaces/presenters/index.tmpl

{{ define "index.tmpl" }}

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>psychedelicnekopunch</title>
	<link rel="stylesheet" href="/css/style.css">
	<script type="text/javascript" src="/js/script.js"></script>
</head>
<body>
	<h1>psychedelicnekopunch</h1>
	index<br>
</body>
</html>

{{ end }}

js ファイルと css ファイル

適当に呼ばれていることがわかるように書く。

カテゴリー:Gin, Go