如何构建Go应用程序以生成多个二进制文件?

Har*_*son 8 go

我正在创建三个非常相似的应用程序,但每个应用程序将应用不同的逻辑.我不知道如何最好地构建它以避免重复代码.

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

每个应用程序将对从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)
}
Run Code Online (Sandbox Code Playgroud)

app1.go:

func processLine(line string) {
    // logic for app 1
}
Run Code Online (Sandbox Code Playgroud)

app2.go:

func processLine(line string) {
    // logic for app 2
}
Run Code Online (Sandbox Code Playgroud)

等等

scr*_*ist 8

以下文件夹结构用于许多流行的go项目中,例如helmkubicorn等。

goproject/
??? bin
??? cmd
??? pkg
??? Makefile
Run Code Online (Sandbox Code Playgroud)

cmd目录将包含不同的二进制文件,并按目录分开。

cmd/
??? bin1
?   ??? main.go
??? bin2
?   ??? main.go
??? bin3
    ??? main.go
Run Code Online (Sandbox Code Playgroud)

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

pkg
??? reusablepackage1
??? reusablepackage2
Run Code Online (Sandbox Code Playgroud)

bin目录是可选的,可用于存储生成的二进制文件。如果您要生成二进制文件,$GOBIN则可以省略。

bin/
??? bin1
??? bin2
??? bin3
Run Code Online (Sandbox Code Playgroud)

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

  • `go.mod` 去哪里了?在基本目录中,还是每个“binX”都有自己的? (5认同)
  • 项目本地的bin目录是一种非常不寻常的模式,将makefile称为“强烈推荐”纯粹是您的意见。 (2认同)
  • 这是一个非常常见的约定,尤其是。在较大的项目中。最好为新来的新手灌输良好的做法。 (2认同)

Grz*_*Żur 7

这些项目的常用目录结构如下所示:

cmd/
    a/
        main.go
    b/
        main.go
Run Code Online (Sandbox Code Playgroud)

要构建可执行文件运行

go build ./cmd/a
go build ./cmd/b
Run Code Online (Sandbox Code Playgroud)

例子