Skip to content

Commit

Permalink
Add example to build single binary with templates (gin-gonic#1328)
Browse files Browse the repository at this point in the history
  • Loading branch information
JINNOUCHI Yasushi authored and appleboy committed Apr 22, 2018
1 parent dfe37ea commit 814ac94
Show file tree
Hide file tree
Showing 8 changed files with 175 additions and 1 deletion.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ go:
- master

git:
depth: 3
depth: 10

install:
- make install
Expand Down
45 changes: 45 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ Gin is a web framework written in Go (Golang). It features a martini-like API wi
- [Support Let's Encrypt](#support-lets-encrypt)
- [Run multiple service using Gin](#run-multiple-service-using-gin)
- [Graceful restart or stop](#graceful-restart-or-stop)
- [Build a single binary with templates](#build-a-single-binary-with-templates)
- [Testing](#testing)
- [Users](#users--)

Expand Down Expand Up @@ -1393,6 +1394,50 @@ func main() {
}
```

### Build a single binary with templates

You can build a server into a single binary containing templates by using [go-assets][].

[go-assets]: https://github.com/jessevdk/go-assets

```go
func main() {
r := gin.New()

t, err := loadTemplate()
if err != nil {
panic(err)
}
r.SetHTMLTemplate(t)

r.GET("/", func(c *gin.Context) {
c.HTML(http.StatusOK, "/html/index.tmpl",nil)
})
r.Run(":8080")
}

// loadTemplate loads templates embedded by go-assets-builder
func loadTemplate() (*template.Template, error) {
t := template.New("")
for name, file := range Assets.Files {
if file.IsDir() || !strings.HasSuffix(name, ".tmpl") {
continue
}
h, err := ioutil.ReadAll(file)
if err != nil {
return nil, err
}
t, err = t.New(name).Parse(string(h))
if err != nil {
return nil, err
}
}
return t, nil
}
```

See a complete example in the `examples/assets-in-binary` directory.

## Testing

The `net/http/httptest` package is preferable way for HTTP testing.
Expand Down
33 changes: 33 additions & 0 deletions examples/assets-in-binary/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Building a single binary containing templates

This is a complete example to create a single binary with the
[gin-gonic/gin][gin] Web Server with HTML templates.

[gin]: https://github.com/gin-gonic/gin

## How to use

### Prepare Packages

```
go get github.com/gin-gonic/gin
go get github.com/jessevdk/go-assets-builder
```

### Generate assets.go

```
go-assets-builder html -o assets.go
```

### Build the server

```
go build -o assets-in-binary
```

### Run

```
./assets-in-binary
```
34 changes: 34 additions & 0 deletions examples/assets-in-binary/assets.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package main

import (
"time"

"github.com/jessevdk/go-assets"
)

var _Assetsbfa8d115ce0617d89507412d5393a462f8e9b003 = "<!doctype html>\n<body>\n <p>Can you see this? → {{.Bar}}</p>\n</body>\n"
var _Assets3737a75b5254ed1f6d588b40a3449721f9ea86c2 = "<!doctype html>\n<body>\n <p>Hello, {{.Foo}}</p>\n</body>\n"

// Assets returns go-assets FileSystem
var Assets = assets.NewFileSystem(map[string][]string{"/": {"html"}, "/html": {"bar.tmpl", "index.tmpl"}}, map[string]*assets.File{
"/": {
Path: "/",
FileMode: 0x800001ed,
Mtime: time.Unix(1524365738, 1524365738517125470),
Data: nil,
}, "/html": {
Path: "/html",
FileMode: 0x800001ed,
Mtime: time.Unix(1524365491, 1524365491289799093),
Data: nil,
}, "/html/bar.tmpl": {
Path: "/html/bar.tmpl",
FileMode: 0x1a4,
Mtime: time.Unix(1524365491, 1524365491289611557),
Data: []byte(_Assetsbfa8d115ce0617d89507412d5393a462f8e9b003),
}, "/html/index.tmpl": {
Path: "/html/index.tmpl",
FileMode: 0x1a4,
Mtime: time.Unix(1524365491, 1524365491289995821),
Data: []byte(_Assets3737a75b5254ed1f6d588b40a3449721f9ea86c2),
}}, "")
4 changes: 4 additions & 0 deletions examples/assets-in-binary/html/bar.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<!doctype html>
<body>
<p>Can you see this? → {{.Bar}}</p>
</body>
4 changes: 4 additions & 0 deletions examples/assets-in-binary/html/index.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<!doctype html>
<body>
<p>Hello, {{.Foo}}</p>
</body>
48 changes: 48 additions & 0 deletions examples/assets-in-binary/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package main

import (
"html/template"
"io/ioutil"
"net/http"
"strings"

"github.com/gin-gonic/gin"
)

func main() {
r := gin.New()
t, err := loadTemplate()
if err != nil {
panic(err)
}
r.SetHTMLTemplate(t)
r.GET("/", func(c *gin.Context) {
c.HTML(http.StatusOK, "/html/index.tmpl", gin.H{
"Foo": "World",
})
})
r.GET("/bar", func(c *gin.Context) {
c.HTML(http.StatusOK, "/html/bar.tmpl", gin.H{
"Bar": "World",
})
})
r.Run(":8080")
}

func loadTemplate() (*template.Template, error) {
t := template.New("")
for name, file := range Assets.Files {
if file.IsDir() || !strings.HasSuffix(name, ".tmpl") {
continue
}
h, err := ioutil.ReadAll(file)
if err != nil {
return nil, err
}
t, err = t.New(name).Parse(string(h))
if err != nil {
return nil, err
}
}
return t, nil
}
6 changes: 6 additions & 0 deletions vendor/vendor.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@
"revision": "5a0f697c9ed9d68fef0116532c6e05cfeae00e55",
"revisionTime": "2017-06-01T23:02:30Z"
},
{
"checksumSHA1": "Cq9h7eDNXXyR/qJPvO8/Rk4pmFg=",
"path": "github.com/jessevdk/go-assets",
"revision": "4f4301a06e153ff90e17793577ab6bf79f8dc5c5",
"revisionTime": "2016-09-21T14:41:39Z"
},
{
"checksumSHA1": "Ajh8TemnItg4nn+jKmVcsMRALBc=",
"path": "github.com/json-iterator/go",
Expand Down

0 comments on commit 814ac94

Please sign in to comment.