Go.mod

From NovaOrdis Knowledge Base
Jump to navigation Jump to search

External

Internal

Overview

go.mod declares the module path, which is the import path prefix for all packages within the module. It also tracks the modules that provide dependencies to this module. go.mod is located in the root of the module, which is also the root of the source tree for the module.

One way to create it is with go mod init:

go mod init <module-path>

The file can also be created manually with a text editor, but Go documentation recommends to make changes to the file via go commands.

go.mod stays with the code, including in the source repository.

A typical go.mod file usually assumes that your project is hosted in GitHub, but this is not a requirement. The module path can be anything.

As go tools are used to manage dependencies, the tools update the go.mod file so that it maintains the current list of dependencies.

go.sum

When a dependency is added, go creates a go.sum file that contains checksums, in form of cryptographic hashes, of dependency modules. This is used to verify the integrity of the downloaded module files. This file should not edited manually.

Example

module example.com/hello

go 1.21.0

require rsc.io/quote v1.5.2

require (
	golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect
	rsc.io/sampler v1.3.0 // indirect
)

Initialize go.mod

In the module root directory, initialize the go.mod file.

go mod init <module-path>
go mod init example.com/generic

Adding a Dependency to a Module

Dependencies are added with the go get command. The command updates go.mod by adding the require directive for dependencies. The require directive tracks the minimum version of a module that the module depends on. The command also updates the module source code and places in the module cache and authenticate each module it downloads. This ensures that it's unchanged ged from when the module was published.

go get [-u] github.com/apache/yunikorn-core@v1.4.0

Note that you are adding the dependency in advance without actually referring it from the module source code, go get will add an "// indirect" comment for that specific dependency in go.mod.

TODO: https://pkg.go.dev/cmd/go#hdr-Add_dependencies_to_current_module_and_install_them

Variations of go get

go get

Update Module's Dependencies

Use go list to check if there are newer versions of dependencies. If there are available useful upgrades, use go get command again to add the particular newer version.

Synchronize Dependencies

TODO: https://go.dev/doc/modules/managing-dependencies#synchronizing

Using Unpublished Module Code

Normally, go mod

Using Local Module Code

TODO: https://go.dev/doc/modules/managing-dependencies#local_directory

Using an Arbitrary Fork Module Code

TODO: https://go.dev/doc/modules/managing-dependencies#external_fork

Getting a Specific Commit

TODO: https://go.dev/doc/modules/managing-dependencies#repo_identifier