资源管理设计的目标之一是在开发阶段不影响静态文件的开发管理,只有在发布的时候执行打包即可,打包完毕后清理临时文件,因此只会影响生成的二进制可执行文件,对开发者来说无感知且使用便捷。

准备工程

建议大家使用GoFrame官方提供的工程化目录结构,并且使用CLI工具来创建自己的项目工程,因为整个框架工程化思想以及一些示例都是基于标准化的工程目录结构,这样更有利于大家学习和使用整个开发框架,提高开发效率。特别是,在工程目录中存在一个packed目录,用以存放资源管理组件的相关打包内容,在默认情况下,里面是一个空的go文件,什么都不会做。

开发阶段

在开发阶段,一般来说,开发者并不需要关心资源管理的事情,该怎么撸码就怎么撸,静态的文件按照建议放到public目录下。在开发阶段的静态文件访问都会直接通过文件系统访问。

准备发布

当开发完毕后,想要将静态文件、模板文件、配置文件打包到二进制可执行文件中,随着二进制可执行文件发布。好的,这个时候资源组件开始介入展示能力了。您需要配置到交叉编译的配置,具体请参考命令行相关章节 交叉编译-build 。我们需要使用到CLI工具来执行可执行文件编译,将您的编译配置通过配置文件管理起来(放到config.yaml文件中),一个参考的编译配置如下:

gfcli:
  build:
    name:      "my-application"
    arch:      "amd64"
    system:    "linux"
    mod:       "none"
    cgo:       0
    packSrc:   "manifest/config,manifest/i18n,resource/public,resource/template"
    version:   ""
    output:    "./bin"
    extra:     ""

请注意其中的pack配置,表示我们在执行编译的时候自动打包到二进制可执行文件中的目录。随后,我们在项目根目录下执行编译命令:

gf build

该命令在编译时会自动将配置文件中指定的目录进行打包成临时的打包go文件,再执行编译,编译完毕后自动清理临时的打包go文件。

大部分场景下,配置文件可能不需要打包进二进制可执行文件,具体根据您的业务场景自行选择。

发布运行

将二进制执行发布执行即可。













Content Menu

  • No labels

5 Comments

  1. gf build看起来没有按照cli的配置生效,尤其是i18n的pack。以下是我的配置文件:

    # HTTP Server.
    [server]
    	address        = ":8199"
    	serverRoot     = "resource/public"
    	serverAgent    = "gf-demos"
    	logPath        = "E:/go-workspace/MyGoFrame/log/"
    	nameToUriType  = 2
    	routeOverWrite = true
        openapiPath    = "/api.json"
        swaggerPath    = "/swagger"
        lang           = "zh-CN"  # 与i18n文件名对应
    # Logger configurations.
    [logger]
        path   = "log/"
        level  = "all"
        rotateExpire = "1d"  # 一天一个回滚
        rotateBackupLimit =  1   # 保留7个日志文件
        writerColorEnable = true  # 日志文件带有颜色
        RotateBackupCompress =  9  # 日志文件压缩级别,0-9,9最高
        stdout = true
        Flags = 44 #日期 时:分:秒:毫秒 文件:行号
    
    
    # Database configurations.
    [database]
        link  = "mysql:root:mysql@tcp(192.168.212.117:3306)/myapp"
        debug = true
    
    # GF-CLI工具配置
    [gfcli]
        # 自定义DAO生成配置(默认是读取database配置)
        [[gfcli.gen.dao]]
            link   = "mysql:root:mysql@tcp(192.168.212.117:3306)/myapp"
            descriptionTag =   true
            noModelComment =   true
            removePrefix =     "gf_"
        [build]
            name=      "my-goframe"
            arch=      "all"
            system=    "all"
            mod=       "none"
            cgo=       0
            pack=      "config,i18n,public,template"
            version=   ""
            output=    "./bin"
            extra=     ""

    以下是我的目录结构

    ├───DEBIAN
    ├───lib
    │   └───systemd
    │       └───system
    └───myapp
        ├───api
        ├───internal
        │   ├───cmd
        │   ├───consts
        │   ├───controller
        │   ├───dao
        │   ├───errorCode
        │   ├───model
        │   │   └───entity
        │   ├───packed
        │   └───service
        │       └───internal
        │           ├───dao
        │           │   └───internal
        │           └───do
        ├───log
        ├───manifest
        │   ├───config
        │   ├───deploy
        │   └───docker
        ├───resource
        │   ├───doc
        │   ├───i18n
        │   │   ├───en
        │   │   └───zh-CN
        │   ├───public
        │   ├───scripts
        │   └───template
        ├───test
        └───utility
            ├───response
            └───utils


    使用 gf build 生成的二进制文件是main.exe,而不是配置文文件指定的配置项。i18n也没有生效。 为什么呢?



    1. 郭大佬看起来有点忙呀! 问题自己搞定了。

      build没有生效,是因为配置文件写错了,toml的格式需要这么写

      [gfcli]
          [gfcli.build]
              name=      "my-goframe"
              arch=      "all"
              system=    "all"
              mod=       "none"
              cgo=       0
              pack=      "config,i18n,public,template"
              version=   ""
              output=    "./bin"
              extra=     ""

      只是还是有疑问:

      1. build的配置项中pack的value指向的目录需要写成:"manifest/config,resource/i18n",而不是config,i18n。默认build命令是从当前目录开始查找的
      2. build的配置项中pack最后生成的data.go文件所在的目录是根目录下的packed而不是internal/packed

      郭强 期待郭大佬的回复

      1. 嗯,是的。

  2. 原目录是这个:

    manifest/config,manifest/i18n,resource/public,resource/template

    打包后目录变成:

    config,i18n,public,template

    不好使

    1. 那你换个姿势:

      [gfcli]
          [gfcli.build]
              name=      "my-goframe"
              arch=      "all"
              system=    "all"
              mod=       "none"
              cgo=       0
              packSrc=      "manifest,resource"
              version=   ""
              output=    "./bin"
              extra=     ""

      打包之后就可以用了