工具打包

我们可以通过gf命令行工具的pack命令实现对任意文件/目录的打包,关于gf命令行工具的安装和使用具体请查看CLI工具链章节。由于通过命令行工具进行打包比较简便,因此也是推荐的打包方式。

gf pack的命令介绍如下:

  1. $ gf pack -h
  2. USAGE
  3. gf pack SRC DST
  4. ARGUMENT
  5. SRC source path for packing, which can be multiple source paths.
  6. DST destination file path for packed file. if extension of the filename is ".go" and "-n" option is given,
  7. it enables packing SRC to go file, or else it packs SRC into a binary file.
  8. OPTION
  9. -n, --name package name for output go file
  10. -p, --prefix prefix for each file packed into the resource file
  11. EXAMPLES
  12. gf pack public data.bin
  13. gf pack public,template data.bin
  14. gf pack public,template boot/data.go -n=boot
  15. gf pack public,template,config resource/resource.go -n=resource
  16. gf pack public,template,config resource/resource.go -n=resource -p=/var/www/my-app
  17. gf pack /var/www/public resource/resource.go -n=resource

1. gf pack生成Go文件

比较推荐的方式是将Go文件直接生成到boot启动目录,并设置生成Go文件的包名为boot,这样该资源文件将会被自动引入到项目中。我们将项目的config,public,template三个目录的文件打包到Go文件,打包命令为:

  1. gf pack config,public,template boot/data.go -n boot

生成的Go文件内容类似于:

  1. package boot
  2. import "github.com/gogf/gf/os/gres"
  3. func init() {
  4. if err := gres.Add("1f8b08000000000002ffb45a095c4cebfb7f51d2284a515"); err != nil {
  5. panic(err)
  6. }
  7. }

可以看到,生成的Go文件中通过gres.Add方法将资源文件的二进制内容添加到默认的资源管理器中,该方法的参数是压缩过后的十六进制字符串,将会在程序启动的时候做解压并在内存中生成一个文件树对象,便于在运行时快速操作文件。

2. 使用打包的Go文件

由于项目的main入口程序文件会引入boot包,例如像这样(module名称为my-app):

  1. import (
  2. _ "my-app/boot"
  3. )

随后可以在项目的任何地方使用gres模块来访问打包的资源文件。

如果使用GF推荐的项目目录结构,在目录结构中会存在boot目录(对应包名也是boot),用于程序启动设置。因此如果将Go文件生成到boot目录下,那么将会被自动编译进可执行文件中。

3. 打印资源管理文件列表

可以通过gres.Dump()方法打印出当前资源管理器中所有的文件列表,输出内容类似于:

  1. 2019-09-15T13:36:28+00:00 0.00B config
  2. 2019-07-27T07:26:12+00:00 1.34K config/config.toml
  3. 2019-09-15T13:36:28+00:00 0.00B public
  4. 2019-06-25T17:03:56+00:00 0.00B public/resource
  5. 2018-12-04T12:50:16+00:00 0.00B public/resource/css
  6. 2018-12-17T12:54:26+00:00 0.00B public/resource/css/document
  7. 2018-12-17T12:54:26+00:00 4.20K public/resource/css/document/style.css
  8. 2018-08-24T01:46:58+00:00 32.00B public/resource/css/index.css
  9. 2019-05-23T03:51:24+00:00 0.00B public/resource/image
  10. 2018-08-20T05:02:08+00:00 24.01K public/resource/image/cover.png
  11. 2019-05-23T03:51:24+00:00 4.19K public/resource/image/favicon.ico
  12. 2018-08-23T01:44:50+00:00 4.19K public/resource/image/gf.ico
  13. 2018-12-04T13:04:34+00:00 0.00B public/resource/js
  14. 2019-06-27T11:06:12+00:00 0.00B public/resource/js/document
  15. 2019-06-27T11:06:12+00:00 11.67K public/resource/js/document/index.js
  16. 2019-09-15T13:36:28+00:00 0.00B template
  17. 2019-02-02T09:08:56+00:00 0.00B template/document
  18. 2018-12-04T12:49:08+00:00 0.00B template/document/include
  19. 2018-12-04T12:49:08+00:00 329.00B template/document/include/404.html
  20. 2019-03-06T01:52:56+00:00 3.42K template/document/index.html
  21. ...

需要注意的是,在使用资源管理器中的资源文件时,需要严格按照其路径进行检索获取。