【问题标题】:Is there a way with Go to build more than one executable with one “go build” command? (as with Rust)? [duplicate]Go 有没有办法用一个“go build”命令构建多个可执行文件? (和 Rust 一样)? [复制]
【发布时间】:2021-10-04 12:40:22
【问题描述】:

使用 Rust,只需在与目标关联的 cargo.toml 文件中指定它们即可生成多个二进制目标:


[[bin]]
name = "daemon"
path = "src/daemon/bin/main.rs"

[[bin]]

name = "client"
path = "src/client/bin/main.rs"

有没有办法用 Go 模块实现相同的功能,即使用一个“go build”命令构建多个可执行文件?

问题示例

//main1.o
//package main

func main() {
    println("From main1")
}

// - - 

//main2.o
//package main

func main() {
    println("From main2")
}

// ---
go build:
// ---

//Result:


./main2.go:3:6: main redeclared in this block
    /Users/sergehulne/Documents/code/Go/tst/main1.go:3:6: previous declaration

【问题讨论】:

  • 根据documentation,可以将多个包传递给go build。你可以试试这个吗?
  • 据我所知,您无法使用“go build”构建多个可执行文件。构建 bash 脚本的问题的解决方案。这是一篇可能对您有帮助的文章digitalocean.com/community/tutorials/…
  • 因此,除了将您的项目划分为多个模块(一个用于项目所需的每个二进制可执行文件)之外,没有其他解决方案。
  • 很多模块都有多个主包,你只需要单独构建它们。
  • 这能回答你的问题吗? How to build multiple package binaries at once

标签: go build target


【解决方案1】:

显然,解决方案是忽略与在一个 Go 模块中具有多个 main() 函数相关的警告,并单独编译文件,就好像它们是一种子模块一样。

go mod init tst  
package main
// file main1.go
func main() {
    println("From main1")
}
package main
// file main2.go
func main() {
    println("From main2")
}

然后依次:

go build main1.go
go build main2.go

分别产生 main1 和 main2(两个可执行文件)

这很尴尬,但它有效。

【讨论】:

  • 这会产生警告,因为它不是一个有效的包。一个主包中不能有多个main 函数。您应该构建包,而不是文件。
  • @JimB :这意味着 main1:go 和 main.go 必须位于单独的专用文件夹中,这违背了模块(模块而不是包)的目的。跨度>
  • 模块是包的集合,包由包含 go 文件的单个目录组成。不管你喜不喜欢,这就是语言工具定义它的方式。
  • @Jimb :所以基本上最小的 Go 编程单元是一个目录,而不是一个文件(与 C、C++、Python 不同)。它似乎不太适合试验、玩弄。
  • Go 会很高兴地在一个隐式包中构建单个文件,正如您在此处显示的那样,用于试验或快速的一次性程序。它仍然不会改变您的具有多个 mains 的目录本身不是一个有效的包。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 2015-08-31
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多