【问题标题】:How to structure Go application to produce multiple binaries?如何构建 Go 应用程序以生成多个二进制文件?
【发布时间】:2018-06-18 07:29:13
【问题描述】:

我正在创建三个彼此非常相似的应用程序,但每个应用程序都会应用不同的逻辑。我不确定如何最好地构造它以避免重复代码。

所有应用程序都有以下共同点: - 读取和解析配置 - 设置 SQL 数据库连接 - 收集统计数据 - 从标准输入中读取

每个应用程序将对从 STDIN 读取的数据应用不同的逻辑。

这会被认为是可以接受的吗?将所有通用代码放在 main.go 中,然后构建为“go build -o bin/app1 main.go app1.go”等等 - 只为每个要构建的二进制文件引入应用程序特定的逻辑?

main.go:

func main() {
    // db connection
    // stats worker
    // read from stdin

    proccessLine(line)
}

app1.go:

func processLine(line string) {
    // logic for app 1
}

app2.go:

func processLine(line string) {
    // logic for app 2
}

等等

【问题讨论】:

标签: go


【解决方案1】:

helmkubicorn等许多流行的go项目中使用了以下文件夹结构。

goproject/
├── bin
├── cmd
├── pkg
└── Makefile

cmd 目录将包含不同的二进制文件,以目录分隔。

cmd/
├── bin1
│   └── main.go
├── bin2
│   └── main.go
└── bin3
    └── main.go

pkg 目录将包含所有可重用的包。在您的情况下,不同二进制文件使用的通用代码。这个目录也可以命名为internal,了解更多here

pkg
├── reusablepackage1
└── reusablepackage2

bin 目录是可选的,它可以用来存放生成的二进制文件。如果您要生成二进制文件到$GOBIN,这可以省略。

bin/
├── bin1
├── bin2
└── bin3

Makefile 可用于编写有用的脚本,例如生成运行测试套件的二进制文件等。您可以使用以下命令 make bin1,make bin2 等。这是可选的,但我强烈推荐这个。因为它使我不必一遍又一遍地编写冗长的构建命令。

【讨论】:

  • 项目本地 bin 目录是一种非常不寻常的模式,将 makefile 称为“强烈推荐”纯粹是您的意见。
  • 这是一个非常常见的约定,尤其是。在较大的项目中。最好为任何出现的新手灌输良好的做法。
  • @scriptonist 在 Git 或 Svn 中使用这样的结构并且只发布其中一个二进制文件时,您如何处理标签名称等(是否删除标签的 bin2 文件夹,如果不是,不是这样变得混乱?)
【解决方案2】:

此类项目的通常目录结构如下所示:

cmd/
    a/
        main.go
    b/
        main.go

构建可执行文件运行

go build ./cmd/a
go build ./cmd/b

例子

【讨论】:

    猜你喜欢
    • 2021-01-06
    • 1970-01-01
    • 2022-01-07
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多