...
1# 'go install pkg@version' works outside a module.
2env GO111MODULE=auto
3go install example.com/cmd/a@v1.0.0
4exists $GOPATH/bin/a$GOEXE
5rm $GOPATH/bin
6
7
8# 'go install pkg@version' reports an error if modules are disabled.
9env GO111MODULE=off
10! go install example.com/cmd/a@v1.0.0
11stderr '^go: modules disabled by GO111MODULE=off; see ''go help modules''$'
12env GO111MODULE=auto
13
14
15# 'go install pkg@version' ignores go.mod in current directory.
16cd m
17cp go.mod go.mod.orig
18! go list -m all
19stderr '^go: example.com/cmd@v1.1.0-doesnotexist: reading http.*/mod/example.com/cmd/@v/v1.1.0-doesnotexist.info: 404 Not Found\n\tserver response: 404 page not found$'
20stderr '^go: example.com/cmd@v1.1.0-doesnotexist: missing go.sum entry for go.mod file; to add it:\n\tgo mod download example.com/cmd$'
21go install example.com/cmd/a@latest
22cmp go.mod go.mod.orig
23exists $GOPATH/bin/a$GOEXE
24go version -m $GOPATH/bin/a$GOEXE
25stdout '^\tmod\texample.com/cmd\tv1.0.0\t' # "latest", not from go.mod
26rm $GOPATH/bin/a
27cd ..
28
29
30# 'go install -modfile=x.mod pkg@version' reports an error, but only if
31# -modfile is specified explicitly on the command line.
32cd m
33env GOFLAGS=-modfile=go.mod
34go install example.com/cmd/a@latest # same as above
35env GOFLAGS=
36! go install -modfile=go.mod example.com/cmd/a@latest
37stderr '^go: -modfile cannot be used with commands that ignore the current module$'
38cd ..
39
40
41# Every test case requires linking, so we only cover the most important cases
42# when -short is set.
43[short] stop
44
45
46# 'go install pkg@version' works on a module that doesn't have a go.mod file
47# and with a module whose go.mod file has missing requirements.
48# With a proxy, the two cases are indistinguishable.
49go install rsc.io/fortune@v1.0.0
50stderr '^go: found rsc.io/quote in rsc.io/quote v1.5.2$'
51exists $GOPATH/bin/fortune$GOEXE
52! exists $GOPATH/pkg/mod/rsc.io/fortune@v1.0.0/go.mod # no go.mod file
53go version -m $GOPATH/bin/fortune$GOEXE
54stdout '^\tdep\trsc.io/quote\tv1.5.2\t' # latest version of fortune's dependency
55rm $GOPATH/bin
56
57
58# 'go install dir@version' works like a normal 'go install' command if
59# dir is a relative or absolute path.
60env GO111MODULE=on
61go mod download rsc.io/fortune@v1.0.0
62! go install $GOPATH/pkg/mod/rsc.io/fortune@v1.0.0
63stderr '^go: go\.mod file not found in current directory or any parent directory; see ''go help modules''$'
64! go install ../pkg/mod/rsc.io/fortune@v1.0.0
65stderr '^go: go\.mod file not found in current directory or any parent directory; see ''go help modules''$'
66mkdir tmp
67cd tmp
68go mod init tmp
69go mod edit -require=rsc.io/fortune@v1.0.0
70! go install -mod=readonly $GOPATH/pkg/mod/rsc.io/fortune@v1.0.0
71stderr '^missing go\.sum entry for module providing package rsc\.io/fortune; to add:\n\tgo mod download rsc\.io/fortune$'
72! go install -mod=readonly ../../pkg/mod/rsc.io/fortune@v1.0.0
73stderr '^missing go\.sum entry for module providing package rsc\.io/fortune; to add:\n\tgo mod download rsc\.io/fortune$'
74go get rsc.io/fortune@v1.0.0
75go install -mod=readonly $GOPATH/pkg/mod/rsc.io/fortune@v1.0.0
76exists $GOPATH/bin/fortune$GOEXE
77cd ..
78rm tmp
79rm $GOPATH/bin
80env GO111MODULE=auto
81
82# 'go install pkg@version' reports errors for meta packages, std packages,
83# and directories.
84! go install std@v1.0.0
85stderr '^go: std@v1.0.0: argument must be a package path, not a meta-package$'
86! go install fmt@v1.0.0
87stderr '^go: fmt@v1.0.0: argument must not be a package in the standard library$'
88! go install example.com//cmd/a@v1.0.0
89stderr '^go: example.com//cmd/a@v1.0.0: argument must be a clean package path$'
90! go install example.com/cmd/a@v1.0.0 ./x@v1.0.0
91stderr '^go: ./x@v1.0.0: argument must be a package path, not a relative path$'
92! go install example.com/cmd/a@v1.0.0 $GOPATH/src/x@v1.0.0
93stderr '^go: '$WORK'[/\\]gopath/src/x@v1.0.0: argument must be a package path, not an absolute path$'
94! go install example.com/cmd/a@v1.0.0 cmd/...@v1.0.0
95stderr '^package cmd/go not provided by module example.com/cmd@v1.0.0$'
96
97# 'go install pkg@version' should accept multiple arguments but report an error
98# if the version suffixes are different, even if they refer to the same version.
99go install example.com/cmd/a@v1.0.0 example.com/cmd/b@v1.0.0
100exists $GOPATH/bin/a$GOEXE
101exists $GOPATH/bin/b$GOEXE
102rm $GOPATH/bin
103
104env GO111MODULE=on
105go list -m example.com/cmd@latest
106stdout '^example.com/cmd v1.0.0$'
107env GO111MODULE=auto
108
109! go install example.com/cmd/a@v1.0.0 example.com/cmd/b@latest
110stderr '^go: example.com/cmd/b@latest: all arguments must refer to packages in the same module at the same version \(@v1.0.0\)$'
111
112
113# 'go install pkg@version' should report an error if the arguments are in
114# different modules.
115! go install example.com/cmd/a@v1.0.0 rsc.io/fortune@v1.0.0
116stderr '^package rsc.io/fortune provided by module rsc.io/fortune@v1.0.0\n\tAll packages must be provided by the same module \(example.com/cmd@v1.0.0\).$'
117
118
119# 'go install pkg@version' should report an error if an argument is not
120# a main package.
121! go install example.com/cmd/a@v1.0.0 example.com/cmd/err@v1.0.0
122stderr '^package example.com/cmd/err is not a main package$'
123
124# Wildcards should match only main packages. This module has a non-main package
125# with an error, so we'll know if that gets built.
126mkdir tmp
127cd tmp
128go mod init m
129go get example.com/cmd@v1.0.0
130! go build example.com/cmd/...
131stderr 'err[/\\]err.go:3:9: undefined: DoesNotCompile( .*)?$'
132cd ..
133
134go install example.com/cmd/...@v1.0.0
135exists $GOPATH/bin/a$GOEXE
136exists $GOPATH/bin/b$GOEXE
137rm $GOPATH/bin
138
139# If a wildcard matches no packages, we should see a warning.
140! go install example.com/cmd/nomatch...@v1.0.0
141stderr '^go: example.com/cmd/nomatch\.\.\.@v1.0.0: module example.com/cmd@v1.0.0 found, but does not contain packages matching example.com/cmd/nomatch\.\.\.$'
142go install example.com/cmd/a@v1.0.0 example.com/cmd/nomatch...@v1.0.0
143stderr '^go: warning: "example.com/cmd/nomatch\.\.\." matched no packages$'
144
145# If a wildcard matches only non-main packages, we should see a different warning.
146go install example.com/cmd/err...@v1.0.0
147stderr '^go: warning: "example.com/cmd/err\.\.\." matched only non-main packages$'
148
149
150# 'go install pkg@version' should report errors if the module contains
151# replace or exclude directives.
152go mod download example.com/cmd@v1.0.0-replace
153! go install example.com/cmd/a@v1.0.0-replace
154cmp stderr replace-err
155
156go mod download example.com/cmd@v1.0.0-exclude
157! go install example.com/cmd/a@v1.0.0-exclude
158cmp stderr exclude-err
159
160# 'go install pkg@version' should report an error if the module requires a
161# higher version of itself.
162! go install example.com/cmd/a@v1.0.0-newerself
163stderr '^go: example.com/cmd/a@v1.0.0-newerself: version constraints conflict:\n\texample.com/cmd@v1.0.0-newerself requires example.com/cmd@v1.0.0, but v1.0.0-newerself is requested$'
164
165
166# 'go install pkg@version' will only match a retracted version if it's
167# explicitly requested.
168env GO111MODULE=on
169go list -m -versions example.com/cmd
170! stdout v1.9.0
171go list -m -versions -retracted example.com/cmd
172stdout v1.9.0
173go install example.com/cmd/a@latest
174go version -m $GOPATH/bin/a$GOEXE
175stdout '^\tmod\texample.com/cmd\tv1.0.0\t'
176go install example.com/cmd/a@v1.9.0
177go version -m $GOPATH/bin/a$GOEXE
178stdout '^\tmod\texample.com/cmd\tv1.9.0\t'
179env GO111MODULE=
180
181# 'go install pkg@version' succeeds when -mod=readonly is set explicitly.
182# Verifies #43278.
183go install -mod=readonly example.com/cmd/a@v1.0.0
184
185
186# 'go install pkg@version' should show a deprecation message if the module is deprecated.
187env GO111MODULE=on
188go install example.com/deprecated/a/cmd/a@latest
189stderr '^go: module example.com/deprecated/a is deprecated: in example.com/deprecated/a@v1.9.0$'
190go install example.com/deprecated/a/cmd/a@v1.0.0
191stderr '^go: module example.com/deprecated/a is deprecated: in example.com/deprecated/a@v1.9.0$'
192
193# 'go install pkg@version' does not show a deprecation message if the module is no longer
194# deprecated in its latest version, even if the module is deprecated in its current version.
195go install example.com/undeprecated/cmd/a@v1.0.0
196! stderr 'module.*is deprecated'
197
198-- m/go.mod --
199module m
200
201go 1.16
202
203require example.com/cmd v1.1.0-doesnotexist
204-- x/x.go --
205package main
206
207func main() {}
208-- replace-err --
209go: example.com/cmd/a@v1.0.0-replace (in example.com/cmd@v1.0.0-replace):
210 The go.mod file for the module providing named packages contains one or
211 more replace directives. It must not contain directives that would cause
212 it to be interpreted differently than if it were the main module.
213-- exclude-err --
214go: example.com/cmd/a@v1.0.0-exclude (in example.com/cmd@v1.0.0-exclude):
215 The go.mod file for the module providing named packages contains one or
216 more exclude directives. It must not contain directives that would cause
217 it to be interpreted differently than if it were the main module.
View as plain text