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

时间:2018-06-18 07:29:14

标签: 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)
}

app1.go:

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

app2.go:

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

2 个答案:

答案 0 :(得分:6)

此类项目的常用目录结构如下:

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

构建可执行文件

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

实施例

答案 1 :(得分:5)

以下文件夹结构用于许多热门go项目,例如Friendly Enough Expression Languagehelm等。

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

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

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

pkg目录将包含所有可重用的包。在您的情况下,不同二进制文件使用的公共代码。此目录也可以命名为internal,详细了解kubicorn

pkg
├── reusablepackage1
└── reusablepackage2

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

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

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