如果我想构建一个可执行文件,是否应该始终从主包的文件夹运行go build?

如果我想构建一个可执行文件,是否应该始终从主包的文件夹运行go build?,go,go-build,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.go,一切正常 不,我决定在包ma

我有一个关于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.go
,一切正常

不,我决定在包
main
中创建一个新函数
doStuff()
,由
main()调用
。因此,应用程序的新结构是

- myapp
  - main
    - main.go
    - stuff.go
  - go.mod
使用
main.go

package main
import "fmt"
func main() {
    fmt.Println("Hello !")
    doStuff()
}
package main
import "fmt"
func doStuff() {
    fmt.Println("I am doing stuff")
}
东西。去做

package main
import "fmt"
func main() {
    fmt.Println("Hello !")
    doStuff()
}
package main
import "fmt"
func doStuff() {
    fmt.Println("I am doing stuff")
}
如果我现在尝试运行相同的构建命令
go build-o bin/main/main.go
我会得到一个错误
main/main.go:4:2:undefined:doStuff

但是如果我移动到
main
文件夹并从那里运行命令
go build-o../bin/main
一切正常


这种行为的原因是什么?如果要创建可执行文件,是否应始终从
main()
所在的文件夹运行
go build
命令?

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

go build -o bin/main ./main


主包通常非常小。所有业务逻辑都倾向于在
pkg/
internal/

中,Go的编译单元是一个包,而不是一个文件,因此在命令行上指定文件名很少是正确的。运行
go build-o bin/main./main
。谢谢。我之所以指定文件名,是因为Go中lambda函数的无服务器框架提供的模板实际上在build命令中使用了文件名。现在很清楚了。最后一个显然是错误的:想想*\u test.go或*\u windows.go文件。我说过你可以做到。按照问题的要求工作。您不应该对主pkg进行单元测试,正如我在回答中提到的,业务逻辑在别处。感谢您,该命令在*\u test.go-in/main dir中运行得非常好。对不起,你说的不对。