| # If the root requirements in a lazy module are inconsistent |
| # (for example, due to a bad hand-edit or git merge), |
| # they can go unnoticed as long as the module with the violated |
| # requirement is not used. |
| # When we load a package from that module, we should spot-check its |
| # requirements and either emit an error or update the go.mod file. |
| |
| cp go.mod go.mod.orig |
| |
| |
| # If we load package x from x.1, we only check the requirements of x, |
| # which are fine: loading succeeds. |
| |
| go list -deps ./usex |
| stdout '^example.net/x$' |
| cmp go.mod go.mod.orig |
| |
| |
| # However, if we load needx2, we should load the requirements of needx2. |
| # Those requirements indicate x.2, not x.1, so the module graph is |
| # inconsistent and needs to be fixed. |
| |
| ! go list -deps ./useneedx2 |
| stderr '^go: updates to go.mod needed; to update it:\n\tgo mod tidy$' |
| |
| ! go list -deps example.net/needx2 |
| stderr '^go: updates to go.mod needed; to update it:\n\tgo mod tidy$' |
| |
| |
| # The command printed in the error message should fix the problem. |
| |
| go mod tidy |
| go list -deps ./useneedx2 |
| stdout '^example.net/m/useneedx2$' |
| stdout '^example.net/needx2$' |
| stdout '^example.net/x$' |
| |
| go list -m all |
| stdout '^example.net/needx2 v0\.1\.0 ' |
| stdout '^example.net/x v0\.2\.0 ' |
| |
| |
| -- go.mod -- |
| module example.net/m |
| |
| go 1.17 |
| |
| require ( |
| example.net/needx2 v0.1.0 |
| example.net/x v0.1.0 |
| ) |
| |
| replace ( |
| example.net/needx2 v0.1.0 => ./needx2.1 |
| example.net/x v0.1.0 => ./x.1 |
| example.net/x v0.2.0 => ./x.2 |
| ) |
| -- useneedx2/useneedx2.go -- |
| package useneedx2 |
| |
| import _ "example.net/needx2" |
| -- usex/usex.go -- |
| package usex |
| |
| import _ "example.net/x" |
| |
| -- x.1/go.mod -- |
| module example.com/x |
| |
| go 1.17 |
| -- x.1/x.go -- |
| package x |
| |
| -- x.2/go.mod -- |
| module example.com/x |
| |
| go 1.17 |
| -- x.2/x.go -- |
| package x |
| |
| const AddedInV2 = true |
| |
| -- needx2.1/go.mod -- |
| module example.com/x |
| |
| go 1.17 |
| |
| require example.net/x v0.2.0 |
| -- needx2.1/needx2.go -- |
| // Package needx2 needs x v0.2.0 or higher. |
| package needx2 |
| |
| import "example.net/x" |
| |
| var _ = x.AddedInV2 |