Shall go build be run always from the folder of the main package if I want to build an executable?

677 Views Asked by At

I have a simple question on the build process in Go.

I have a very simple app, the simplest possible, which is structured like this

- myapp
  - main
    - main.go
  - go.mod

with main.go being

package main
import "fmt"
func main() {
    fmt.Println("Hello !")
}

From within the folder myapp I run the command go build -o bin/main main/main.go and everything works.

No I decide to create a new function doStuff() in the package main to be called by main() but I want to have it in a different file stuff.go. So the new structure of the app is

- myapp
  - main
    - main.go
    - stuff.go
  - go.mod

with main.go being

package main
import "fmt"
func main() {
    fmt.Println("Hello !")
    doStuff()
}

and stuff.go being

package main
import "fmt"
func doStuff() {
    fmt.Println("I am doing stuff")
}

If I try now to run the same build command go build -o bin/main main/main.go I get an error main/main.go:4:2: undefined: doStuff.

But if I move into the main folder and run from there the command go build -o ../bin/main everything works.

Which is the reason of this behaviour? Shall I always run the go build command from the folder where main() is if i want to create an executable?

1

There are 1 best solutions below

3
On

If package main is split into multiple files, you can do either of the following:

go build -o bin/main ./main

or

go build -o bin/main ./main/*

Main packages are typically very small. All business logic tends to either be in pkg/ or internal/.