Golang modules

From wikinotes

Go modules are a collection of packages that are intended to be released together.
You define your project requirements in at the module level,
and you can publish module-versions to the go package index.

Documentation

private modules https://go.dev/ref/mod#private-modules
module proxies https://go.dev/ref/mod#module-proxy
module cache https://go.dev/ref/mod#module-cache

Locations

go module index https://index.golang.org/index
go checksum index https://sum.golang.org/

module path

The module path determines how your package is identified,
what the executable will be called,
how it will be downloaded,
and it can be filtered to ensure it is private.

example:

example.com/x/foo

See golang module path.

Go.mod file

The go.mod file stores metadata about your project, and it's requirements.
There are several tools to help manage it, but this is the source of truth.

Module Requirements

Tools

See also go.mod file .

go mod init example.com/x/myproject  # create a new module

go mod graph   # show requirements tree
go mod tidy    # ensure go.mod matches src (add requirements if necessary)
go mod vendor  #

# add/update requirements to project
go get example.com/module@latest  # update to latest
go get example.com/module v1.1.1  # update/downgrade to target version

Vendoring

Publishing Modules

Public Modules

All published packages are public by default.
You can retract package versions if you discovered a mistake.
Official package publishing instructions here.

Release Preparation

go mod tidy
go test
git tag v0.0.1
git push origin v0.0.1

Publishing your package

# adds your package to the index
go list

# add specific module-version to a specific-index
GOPROXY=proxy.golang.org \
  go list \
  -m example.com/mymodule@v0.1.0

Private Modules

Go executables are installed/built from src.
You'll need to add your package to $GOPRIVATE envvar to stop it from being indexed.
While unset $GONOPROXY and $GONOSUMDB, will fall back on $GOPRIVATE.
Otherwise you'll want to set these to prevent your packages from getting added to the index.

See also golang module path.