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

准备工程

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

开发阶段

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

准备发布

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

gfcli:
  build:
    name:      "my-app"
    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

6 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=     ""

      打包之后就可以用了

  3. 在使用 docker 编译的时候,需要怎么样才能包含 i18n 资源???

    我的配置如下:

    编译配置
      # 项目编译
      # docs: https://goframe.org/pages/viewpage.action?pageId=1115788
      build:
        name: "app"
        #arch: "amd64"
        #system: "linux"
        mod: "none"
        cgo: 0
        packSrc: "resource"
    #    packSrc: "resource/i18n,resource/public,resource/template"
        version: "0.0.1"
        output: "./bin/app"
        extra: ""


    使用下面的 Dockerfile 进行编译运行


    Dockerfile
    ARG GOLANG_VERSION=1.20
    
    # 时区 --build-arg TIMEZONE=Asia/Shanghai
    ARG TIMEZONE=Asia/Shanghai
    
    
    FROM golang:${GOLANG_VERSION} AS builder
    
    # 时区
    ENV TZ=${TIMEZONE}
    
    # go env
    RUN go env -w GOPROXY="https://goproxy.cn,https://goproxy.io,direct" \
        && go env -w GO111MODULE=on \
        && go env
    
    WORKDIR /src
    
    COPY go.mod go.sum ./
    
    RUN go mod download -x
    
    COPY . /src
    
    RUN make cli-dependents && make wire && make build
    
    
    FROM debian:stable-slim as final
    
    # 时区
    ENV TZ=${TIMEZONE}
    
    WORKDIR /app
    
    COPY --from=builder /src/bin /app/bin/
    
    RUN set -eux \
        && cd /tmp/ \
        # ustc.edu
        # debian 12 之前的版本
        #&& ([ -f /etc/apt/sources.list ] && sed -i 's|deb.debian.org|mirrors.ustc.edu.cn|g' /etc/apt/sources.list) \
        # debian 12 改变了源文件
        && ([ -f /etc/apt/sources.list.d/debian.sources ] && sed -i 's|deb.debian.org|mirrors.ustc.edu.cn|g' /etc/apt/sources.list.d/debian.sources) \
        # aliyun
        # debian 12 之前的版本
        #&& ([ -f /etc/apt/sources.list ] && sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list) \
        # debian 12 改变了源文件
        # && ([ -f /etc/apt/sources.list.d/debian.sources ] && sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources) \
        && rm -rf /var/lib/apt/lists/* \
        && apt-get update --fix-missing \
        && apt-get update \
        && apt-get install -y --no-install-recommends \
            netbase \
    		ca-certificates  \
            procps \
            curl \
            iputils-ping \
        && rm -rf /var/lib/apt/lists/* /var/cache/apt/* /tmp/* \
        && apt-get autoremove -y  \
        && apt-get autoclean -y \
        && apt-get clean -y \
        && chmod +x /app/bin/* \
        && mkdir -p /app/config /app/logs
    
    
    # http 服务端口
    EXPOSE 8000
    # 配置文件目录
    VOLUME /app/config
    
    #ENTRYPOINT ["/app/bin/app", "http", "--with-task","--app-config", "/app/config/config.yaml"]
    CMD ["/app/bin/app", "http", "--with-task","--app-config", "/app/config/config.yaml"]
    
    


    构建命令

    docker 编译
    # 编译
    docker build --file manifest/docker/Dockerfile  --tag=cstm:0.0.1  .
    
    # 运行
    docker run --name cstm -it --rm  -p 8888:8888 \
    -v /customeow-goframe/manifest/config:/app/config \
    cstm:0.0.1  /app/bin/app http --with-task --app-config=/app/config/config.yaml


    运行后, i18n 资源没法加载

    编译命令主要是 make build ,使用的是 gf 内置的 Makefile ,但是无法加载,如果在宿主机直接执行 make build  再以同样的命令运行程序,是可以加载资源的

    我不清楚 这个资源管理是否怎么维护静态文件的???请问可以指导一下吗?堵在这里很久了。。。 郭强