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