go打包静态文件到可执行文件中

原链接:Go 1.16 使用 Embed 嵌入静态资源 | 视频文字稿-技术圈

go1.16 版本已经 release 了,推出了一些新功能特性,其中有一个 embed 的新功能,通过 embed 可以将静态资源文件直接打包到二进制文件中,这样当我们部署 Web 应用的时候就特别方便了,只需要构建成一个二进制文件即可,以前也有一些第三方的工具包可以支持这样的操作,但是毕竟不是官方的。接下来我们就来为大家简单介绍下 embed 功能的基本使用。

安装

要测试 embed 功能,当然需要我们更新 go 到 1.16 版本,我们可以通过下面的方式进行安装,当然也可以直接下载安装包配置(https://golang.org/dl/#go1.16)。

示例

查看下面的简单示例:

package main

import (
 _ "embed"
 "fmt"
)

//go:embed hello.txt
var s string

func main() {
 fmt.Println(s)
}

可以看到上面的代码中出现了一个 go:embed 关键字的注解,通过该注解可以直接读取本地静态文件,在上面代码目录下面创建 hello.txt 静态文件,然后就可以直接编译打包运行了:

➜  go1.16 run main.go 
Hello embed in golang 1.16
➜  cat hello.txt        
Hello embed in golang 1.16%                                                               
➜  go1.16 run main.go
Hello embed in golang 1.16
➜  go1.16 build main.go 
➜  rm hello.txt                                  
➜  ./main                        
Hello embed in golang 1.16

可以看到我们已经将静态文件直接打包进了二进制文件中。此外还可以引用多个文件或目录:

package server

import "embed"

// content holds our static web server content.
//go:embed image/* template/*
//go:embed html/index.html
var content embed.FS

可以看到 go:embed 支持多个目录、单个文件或者多个文件,如果在代码中没有使用到 embed.FS,则需要在 import 的时候加上 _ 。

下面我们再和大家演示下如何将 embed 和 Gin 框架进行整合。

集成 Gin

假设 Gin 项目下需要使用静态资源以及 Template 视图模板,结构如下所示:

├── assets
│   └── images
│       └── k8sjob.png
├── go.mod
├── go.sum
├── main.go
└── templates
    ├── foo
    │   └── bar.tmpl
    └── index.tmpl

现在我们利用 embed 就可以将上面的 templates 和 assets 目录直接打包到二进制文件中,直接查看 main.go

package main

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

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

//go:embed assets/* templates/*
var f embed.FS

func main() {
 router := gin.Default()
 templ := template.Must(template.New("").ParseFS(f, "templates/*.tmpl", "templates/foo/*.tmpl"))
 router.SetHTMLTemplate(templ)

 // example: /public/assets/images/k8sjob.png
 router.StaticFS("/public", http.FS(f))

 router.GET("/", func(c *gin.Context) {
  c.HTML(http.StatusOK, "index.tmpl", gin.H{
   "title": "Embed Demo",
  })
 })

 router.GET("/foo", func(c *gin.Context) {
  c.HTML(http.StatusOK, "bar.tmpl", gin.H{
   "title": "Foo Bar",
  })
 })

 router.Run(":8080")
}

我们只需要使用简单的两行代码就可以将静态资源文件进行打包了:

//go:embed assets/* templates/*
var f embed.FS

静态资源文件可以通过下面的路由进行访问:

// example: /public/assets/images/k8sjob.png
router.StaticFS("/public", http.FS(f))

总结

有了 embed 这项功能后,当我们部署 Golang 应用的时候,就可以直接忽略静态资源文件了,变成一个单纯的二进制文件,以后对于一些相对私密的文件也可以通过该方式直接在构建流水线中替换掉再进行编译打包,实在是太方便了。

在将Vue的打包文件(dist目录静态资源)整合进Golang可执行文件,可以使用go-bindata等工具来实现。 首先,需要将dist目录静态资源文件(如js、css、图片等)转化为Go代码。可以使用go-bindata这个go工具来实现,这个工具会将静态文件编译为Go代码,可以在程序直接访问到。具体操作步骤如下: 1. 安装go-bindata工具: ```shell go get -u github.com/go-bindata/go-bindata/... ``` 2. 在项目根目录创建一个文件夹(如assets),用于存放生成的绑定数据文件。 3. 在终端进入到dist目录下,执行以下命令将dist目录下的所有文件转化为Go代码,并输出到assets文件: ```shell go-bindata -o ../assets/assets.go -pkg assets ./... ``` 4. 在Go代码引入生成的assets.go文件,即可在代码访问到dist目录静态资源文件。在代码使用`assets.Asset(filename string)`方法来获取静态资源文件的内容。 接下来,需要将Vue打包文件整合进Golang可执行文件,可以使用Go的embed包来实现,这个包在Go 1.16版本新增。embed包可以将静态资源文件嵌入到可执行文件,无需再依赖外部文件。具体操作步骤如下: 1. 在Go代码引入embed包: ```go import "embed" ``` 2. 使用embed包的`//go:embed`指令将dist目录静态资源文件嵌入到可执行文件。例如: ```go //go:embed dist/* var staticFiles embed.FS ``` 3. 在代码可以通过`staticFiles`来访问嵌入的静态资源文件。 最后,将Golang代码编译为可执行文件时,dist目录静态资源文件会自动嵌入到可执行文件。可以通过`go build`命令来编译项目: ```shell go build -o myapp main.go ``` 编译成功后,会生成可执行文件myapp,该文件已经包含了dist目录静态资源文件,可以直接运行该文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值