forked from mirror/gin
Add example to build single binary with templates (#1328)
This commit is contained in:
parent
dfe37ea6f1
commit
814ac9490a
|
@ -9,7 +9,7 @@ go:
|
|||
- master
|
||||
|
||||
git:
|
||||
depth: 3
|
||||
depth: 10
|
||||
|
||||
install:
|
||||
- make install
|
||||
|
|
45
README.md
45
README.md
|
@ -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--)
|
||||
|
||||
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
```
|
|
@ -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),
|
||||
}}, "")
|
|
@ -0,0 +1,4 @@
|
|||
<!doctype html>
|
||||
<body>
|
||||
<p>Can you see this? → {{.Bar}}</p>
|
||||
</body>
|
|
@ -0,0 +1,4 @@
|
|||
<!doctype html>
|
||||
<body>
|
||||
<p>Hello, {{.Foo}}</p>
|
||||
</body>
|
|
@ -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
|
||||
}
|
|
@ -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",
|
||||
|
|
Loading…
Reference in New Issue