如何组织 Golang 项目目录,使一个项目包含多个 main 入口程序

更新日期: 2020-05-28 阅读次数: 23723 字数: 515 分类: golang

真实需求场景

例如,我在写一个分析百度统计实时访客历史记录的系统,其包含的基本模块:

  • 一个 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

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式