真实需求场景
例如,我在写一个分析百度统计实时访客历史记录的系统,其包含的基本模块:
- 一个 GoAdmin 写的 Web 管理后台服务
- 一个 CSV 数据文件导入 MySQL 的命令
测试项目根目录下是否可以共存两个 main 入口程序
先不管网上的那些 golang 代码组织策略,单纯的测试一下是否可以在项目根目录下共存两个 main 入口程序。
测试方法:
- 既有的 import_log.go 中已经有一个 main 函数了
- 新建一个 main.go 文件,与 import_log.go 同属 package main,包含一个简单的 main 函数,输出 Hello world
运行 go build,果然报错:
> go build
# golog
./main.go:7:6: main redeclared in this block
previous declaration at ./import_log.go:19:6
这说明同一个目录下只能有一个 main 函数。
在不同目录下新建两个 main 函数呢
我的几个疑问:
- 不同目录下的 go 代码文件,是否可以同属于 package main?
- 不同目录下的 main 函数,是否可以 go build 一键生成多个二进制文件?
- 多个 main 入口文件,是否需要多个 go.mod?
测试方法:
- 新建一个目录,例如 cmd,将 main.go 移动到 cmd 目录下
这种方法确实可行。
测试结果:
- 在根目录下执行 go build, 只会生成根目录下 main 函数对应的二进制文件。cmd 目录下的 main.go 没有被编译。
- 到 cmd 下执行 go build,可以成功编译,并运行。
- 两个不同的入口文件确实可以同属于 package main.
到目前为止,独立一个 cmd 目录已经满足了我当前项目的需求。
但是,需要再发散一下。
golang 项目中包含多个工具命令呢
如果多个工具命令都包含在一个 cmd 中,还是会出现最初的 main redeclared 问题。
那就需要在 cmd 下再建子目录。
参考
- https://eli.thegreenplace.net/2019/simple-go-project-layout-with-modules/
- https://stackoverflow.com/questions/50904560/how-to-structure-go-application-to-produce-multiple-binaries