How to point Go module dependency in go.mod to a latest commit in a repo?
GitGoModuleGit Problem Overview
Starting with v1.11 Go added support for modules. Commands
go mod init <package name>
go build
would generate go.mod
and go.sum
files that contain all found versions for the package dependencies.
If a module does not have any releases, the latest commit of that module is used. If a module does have releases, the latest one is picked as a dependency.
However sometimes I would need functionality that is not in a published release yet, but from a commit made after that release. How do I set go.mod
to point not to a release of a module, but to a specific commit in the module's repository?
It looks like I can do it by hand in go.mod with
module /my/module
require (
...
github.com/someone/some_module v0.0.0-20181121201909-af044c0995fe
...
)
where v0.0.0
does not correspond to the last published release tag, 20181121201909
would be a commit timestamp and af044c0995fe
would be the commit hash? Should such information to be found and entered by hand, or there is a better way?
Git Solutions
Solution 1 - Git
Just 'go get' at the commit hash you want:
go get github.com/someone/some_module@af044c0995fe
'go get' will correctly update the dependency files (go.mod, go.sum).
More information: https://github.com/golang/go/wiki/Modules#how-to-upgrade-and-downgrade-dependencies
Solution 2 - Git
In addition the answer from Everton on using go get github.com/someone/some_module@af044c0995fe
to get a specific commit, you can also use branch names such as:
go get github.com/someone/some_module@master
go get github.com/someone/some_module@dev_branch
Those examples get the latest commit on the corresponding branch.
It will still be recorded as a pseudo-version in your go.mod
file, such as v0.0.0-20171006230638-a6e239ea1c69
. (This helps provide a simple total ordering across all versions based on standard semver ordering).
Solution 3 - Git
If you want to temporarily substitute a dependency to a local directory (for example if you work on 2 modules sumultaneously) you can add replace
statement at the end of go.mod
file:
module example.com/mypkg
go 1.15
require (
gitlab.com/someone/a_package v0.14.2
)
replace gitlab.com/someone/a_package => ../my_forks/a_package
Solution 4 - Git
I have been banging my head for some time that how it works for everyone and I am not able to run it. For me, I had to commit to master branch then only I was able to get it.
For go get to work with specific branch, commit id or tag, you need to enable a flag for go module by running below command
> go env -w GO111MODULE=on
after this we will be able to do
go get repo@branchname
go get repo@tag
go get repo@commithash
Solution 5 - Git
Also if you put the word latest in place of the tag in the go.mod file it will get changed to the latest tag the modules.
For example:
module /my/module
require (
...
github.com/someone/some_module latest
...
)
will become
module /my/module
require (
...
github.com/someone/some_module v2.0.39
...
)
after running go mod tidy
Solution 6 - Git
- Download source from branch
go get your-repo@branch-name
read output with go module version to be added torequire
orreplace
:
go: downloading github.com/your-repo v1.2.3-0.20210609123456-123123123 - Later this version can be found as output string of the following command
go list -m -json your-repo@branch-name | jq '.|"\(.Path) \(.Version)"'
- If
jq
is not installed on your PC - manually combinePath
andVersion
values of result from:go list -m -json your-repo@branch-name
separated by space:
your-repository v1.2.3-0.20210609123456-123123123