| # This test checks the behavior of 'go run' with a 'cmd@version' argument. |
| # Most of 'go run' is covered in other tests. |
| # mod_install_pkg_version covers most of the package loading functionality. |
| # This test focuses on 'go run' behavior specific to this mode. |
| [short] skip |
| |
| # 'go run pkg@version' works outside a module. |
| env GO111MODULE=auto |
| go run example.com/cmd/a@v1.0.0 |
| stdout '^a@v1.0.0$' |
| |
| |
| # 'go run pkg@version' reports an error if modules are disabled. |
| env GO111MODULE=off |
| ! go run example.com/cmd/a@v1.0.0 |
| stderr '^go: modules disabled by GO111MODULE=off; see ''go help modules''$' |
| env GO111MODULE=on |
| |
| |
| # 'go run pkg@version' ignores go.mod in the current directory. |
| cd m |
| cp go.mod go.mod.orig |
| ! go list -m all |
| stderr '^go list -m: example.com/cmd@v1.1.0-doesnotexist: missing go.sum entry; to add it:\n\tgo mod download example.com/cmd$' |
| go run example.com/cmd/a@v1.0.0 |
| stdout '^a@v1.0.0$' |
| cmp go.mod go.mod.orig |
| cd .. |
| |
| |
| # 'go install pkg@version' works on a module that doesn't have a go.mod file |
| # and with a module whose go.mod file has missing requirements. |
| # With a proxy, the two cases are indistinguishable. |
| go run rsc.io/fortune@v1.0.0 |
| stderr '^go: found rsc.io/quote in rsc.io/quote v1.5.2$' |
| stderr '^Hello, world.$' |
| |
| |
| # 'go run pkg@version' should report an error if pkg is not a main package. |
| ! go run example.com/cmd/err@v1.0.0 |
| stderr '^package example.com/cmd/err is not a main package$' |
| |
| |
| # 'go run pkg@version' should report errors if the module contains |
| # replace or exclude directives. |
| go mod download example.com/cmd@v1.0.0-replace |
| ! go run example.com/cmd/a@v1.0.0-replace |
| cmp stderr replace-err |
| |
| go mod download example.com/cmd@v1.0.0-exclude |
| ! go run example.com/cmd/a@v1.0.0-exclude |
| cmp stderr exclude-err |
| |
| |
| # 'go run dir@version' works like a normal 'go run' command if |
| # dir is a relative or absolute path. |
| go mod download rsc.io/fortune@v1.0.0 |
| ! go run $GOPATH/pkg/mod/rsc.io/fortune@v1.0.0 |
| stderr '^go: go\.mod file not found in current directory or any parent directory; see ''go help modules''$' |
| ! go run ../pkg/mod/rsc.io/fortune@v1.0.0 |
| stderr '^go: go\.mod file not found in current directory or any parent directory; see ''go help modules''$' |
| mkdir tmp |
| cd tmp |
| go mod init tmp |
| go mod edit -require=rsc.io/fortune@v1.0.0 |
| ! go run -mod=readonly $GOPATH/pkg/mod/rsc.io/fortune@v1.0.0 |
| stderr '^missing go\.sum entry for module providing package rsc\.io/fortune; to add:\n\tgo mod download rsc\.io/fortune$' |
| ! go run -mod=readonly ../../pkg/mod/rsc.io/fortune@v1.0.0 |
| stderr '^missing go\.sum entry for module providing package rsc\.io/fortune; to add:\n\tgo mod download rsc\.io/fortune$' |
| cd .. |
| rm tmp |
| |
| |
| # 'go run' does not interpret @version arguments after the first. |
| go run example.com/cmd/a@v1.0.0 example.com/doesnotexist@v1.0.0 |
| stdout '^a@v1.0.0$' |
| |
| |
| # 'go run pkg@version' succeeds when -mod=readonly is set explicitly. |
| # Verifies #43278. |
| go run -mod=readonly example.com/cmd/a@v1.0.0 |
| stdout '^a@v1.0.0$' |
| |
| -- m/go.mod -- |
| module m |
| |
| go 1.16 |
| |
| require example.com/cmd v1.1.0-doesnotexist |
| -- x/x.go -- |
| package main |
| |
| func main() {} |
| -- replace-err -- |
| go run: example.com/cmd/a@v1.0.0-replace (in example.com/cmd@v1.0.0-replace): |
| The go.mod file for the module providing named packages contains one or |
| more replace directives. It must not contain directives that would cause |
| it to be interpreted differently than if it were the main module. |
| -- exclude-err -- |
| go run: example.com/cmd/a@v1.0.0-exclude (in example.com/cmd@v1.0.0-exclude): |
| The go.mod file for the module providing named packages contains one or |
| more exclude directives. It must not contain directives that would cause |
| it to be interpreted differently than if it were the main module. |