Hi,

Using Go 1.14, I'm working on a parent codebase which, in its go.mod file, has a number of replace statements referencing legacy child codebases which have not yet converted to Go modules.

At this stage the legacy child codebases handle versioning by branch, rather than using semantic versioning, so my go.mod file has a number of statements like these:

replace github.com/foo/bar => github.com/foo/bar 
v0.0.0-2020xxxxxxxxxx-hhhhhhhhhhhh // should track branch baz
replace github.com/foo/bar1 => github.com/foo/bar1 
v0.0.0-2020yyyyyyyyyy-iiiiiiiiiiii // should track branch baz

My goal is to be confident that if I update dependencies in the parent codebase (go get -u ./...), I'll be pulling in HEAD on the relevant branch of all the legacy child dependencies.

My expectation is that this is a transitional use case because eventually the child codebases will migrate to Go modules, but until then, it's important to me to know I will pull in critical fixes from the child dependencies if they happen.

The difficulty I've got is ensuring that the replace stanzas are valid and up-to-date. I'm not finding a great way to do this with the Go module tooling and I wonder if I'm missing anything. Here are the feasible ugly alternatives I've found so far:

1. Child by child, abuse the fact that `go mod tidy` rightly or wrongly seems to tolerate a single legacy branch reference in the file at a time and rewrites it to the v0.0.0-2020xxxxxxxxxx-hhhhhhhhhhhh format:

go mod edit -replace github.com/foo/bar=github.com/foo/bar@baz
go mod tidy
go mod edit -replace github.com/foo/bar1=github.com/foo/bar1@baz
go mod tidy
...etc...
go get -u ./...

2. A script to be run manually (or via go generate? yikes!) before running go get -u ./..., containing abominations like this:

go mod edit -replace github.com/foo/bar=$(go list -mod=mod -m 
github.com/foo/bar@baz | sed -e 's/ /@/')
go mod edit -replace github.com/foo/bar1=$(go list -mod=mod -m 
github.com/foo/bar1@baz | sed -e 's/ /@/')
...etc...
go get -u ./...

3. Alternative abominations like this:

go mod edit -replace github.com/foo/bar=github.com/foo/bar $(curl -s 
https://proxy.golang.org/github.com/foo/bar/@v/baz.info | jq -r .Version)
go mod edit -replace github.com/foo/bar1=github.com/foo/bar1 $(curl -s 
https://proxy.golang.org/github.com/foo/bar1/@v/baz.info | jq -r .Version)
...etc...
go get -u ./...

I'm wondering: is there a better way?  Should there be?

Many thanks!

Jim Minter

--
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/922448f0-00cf-7f7e-efdc-50965aefc6d4%40minter.uk.

Reply via email to