资源管理设计的目标之一是在开发阶段不影响静态文件的开发管理,只有在发布的时候执行打包即可,打包完毕后清理临时文件,因此只会影响生成的二进制可执行文件,对开发者来说无感知且使用便捷。
建议大家使用GoFrame官方提供的工程化目录结构,并且使用CLI工具来创建自己的项目工程,因为整个框架工程化思想以及一些示例都是基于标准化的工程目录结构,这样更有利于大家学习和使用整个开发框架,提高开发效率。特别是,在工程目录中存在一个packed目录,用以存放资源管理组件的相关打包内容,在默认情况下,里面是一个空的go文件,什么都不会做。
GoFrame
CLI
packed
go
在开发阶段,一般来说,开发者并不需要关心资源管理的事情,该怎么撸码就怎么撸,静态的文件按照建议放到resource目录下。在开发阶段的静态文件访问都会直接通过文件系统访问。
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配置,表示我们在执行编译的时候自动打包到二进制可执行文件中的目录。随后,我们在项目根目录下执行编译命令:
pack
gf build
该命令在编译时会自动将配置文件中指定的目录进行打包成临时的打包go文件,再执行编译,编译完毕后自动清理临时的打包go文件。
大部分场景下,配置文件可能不需要打包进二进制可执行文件,具体根据您的业务场景自行选择。
将二进制执行发布执行即可。
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也没有生效。 为什么呢?
郭大佬看起来有点忙呀! 问题自己搞定了。
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= ""
只是还是有疑问:
郭强 期待郭大佬的回复
嗯,是的。
原目录是这个:
manifest/config,manifest/i18n,resource/public,resource/template
打包后目录变成:
config,i18n,public,template
不好使
那你换个姿势:
[gfcli] [gfcli.build] name= "my-goframe" arch= "all" system= "all" mod= "none" cgo= 0 packSrc= "manifest,resource" version= "" output= "./bin" extra= ""
打包之后就可以用了
在使用 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 进行编译运行
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 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 再以同样的命令运行程序,是可以加载资源的
make build
Makefile
我不清楚 这个资源管理是否怎么维护静态文件的???请问可以指导一下吗?堵在这里很久了。。。 郭强
6 Comments
白夜
gf build看起来没有按照cli的配置生效,尤其是i18n的pack。以下是我的配置文件:
以下是我的目录结构
使用 gf build 生成的二进制文件是main.exe,而不是配置文文件指定的配置项。i18n也没有生效。 为什么呢?
白夜
郭大佬看起来有点忙呀! 问题自己搞定了。
build没有生效,是因为配置文件写错了,toml的格式需要这么写
只是还是有疑问:
郭强 期待郭大佬的回复
郭强
嗯,是的。
yidashi
原目录是这个:
manifest/config,manifest/i18n,resource/public,resource/template
打包后目录变成:
config,i18n,public,template
不好使
白夜
那你换个姿势:
打包之后就可以用了
overbeck.jack
在使用 docker 编译的时候,需要怎么样才能包含 i18n 资源???
我的配置如下:
使用下面的 Dockerfile 进行编译运行
构建命令
运行后, i18n 资源没法加载
编译命令主要是
make build
,使用的是 gf 内置的Makefile
,但是无法加载,如果在宿主机直接执行make build
再以同样的命令运行程序,是可以加载资源的我不清楚 这个资源管理是否怎么维护静态文件的???请问可以指导一下吗?堵在这里很久了。。。 郭强