go - 如果要构建可执行文件,应始终从主软件包的文件夹运行构建文件吗?

标签 go go-build

我对Go中的构建过程有一个简单的问题。
我有一个非常简单的应用,最简单的应用,其结构如下

- myapp
  - main
    - main.go
  - go.mod
与main.go被
package main
import "fmt"
func main() {
    fmt.Println("Hello !")
}
在文件夹myapp中,我运行命令go build -o bin/main main/main.go,一切正常。
否,我决定在doStuff()调用的main包中创建一个新函数main(),但我想将其保存在其他文件stuff.go中。因此,该应用程序的新结构是
- myapp
  - main
    - main.go
    - stuff.go
  - go.mod
main.go
package main
import "fmt"
func main() {
    fmt.Println("Hello !")
    doStuff()
}
stuff.go
package main
import "fmt"
func doStuff() {
    fmt.Println("I am doing stuff")
}
如果现在尝试运行相同的构建命令go build -o bin/main main/main.go,则会收到错误main/main.go:4:2: undefined: doStuff
但是,如果我进入main文件夹并从那里运行命令go build -o ../bin/main,一切正常。
这种行为的原因是什么?如果要创建可执行文件,是否总是从go build所在的文件夹中运行main()命令?

最佳答案

如果将main包拆分为多个文件,则可以执行以下任一操作:

go build -o bin/main ./main
要么
go build -o bin/main ./main/*
主程序包通常很小。所有业务逻辑都倾向于使用pkg/internal/

关于go - 如果要构建可执行文件,应始终从主软件包的文件夹运行构建文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62930116/

相关文章:

go - 拨 unixgram : no such file or directory error

go - 从本地子目录导入包

go - 错误: "build flag -mod=vendor only valid when using modules" when building Go project

go - 如何使用github.com/mattn/go-sqlite3为Google Cloud VM交叉编译Go软件包?

go - 填充缓冲 channel 直到变满或持续时间过去

go - 使用整数作为小数系数而不是 float 对于货币应用来说是个好主意吗?

go - 如何使用反射附加到 slice ?

go - 使用 govc 查找附加到 vm 的磁盘

go - 为什么 go build 会因为 regexp.MustCompile 解析错误而成功?