Go makes downloading projects and their dependencies very easy. In the beginning there was go get which will download the project source code and its dependencies to $GOPATH/src. With modules, all the dependencies are downloaded to $GOPATH/pkg/mod. The ease of downloading and the lack of management control in the go command means that is easy for the two directories to grow in size and to lose track of which project led to the download of a particular package.
I recently started to play around with the Fyne UI toolkit. I didn't initially know what other packages it would download so I wanted to have Fyne and its dependencies in their own area. The go command has a flag -pkgdir that is shared by the various commands.
The build flags are shared by the build, clean, get, install, list, run, and test commands:
install and load all packages from dir instead of the usual locations. For example, when building with a non-standard configuration, use -pkgdir to keep generated packages in a separate location.
This didn't work as I expected because it didn't seem like it did anything at all. Using the command
go build -pkgdir /tmp
resulted in all the downloaded package still going to $GOPATH/pkg/mod.
What did work (thanks to seankhliao) is to set the GOMODCACHE variable which sets more then the cache location but also the package location:
GOMODCACHE=/tmp go build
All the downloaded dependency packages will now be downloaded to /tmp rather then $GOPATH/pkg/mod.
Honestly, I'm not really sure what -pkgdir is really suppose to do. Maybe it is only for things that the build command generates? Why does it do when using with go get?