cmd/go: resolve local paths to modules in subdirectory replacements

siotufzp  于 22天前  发布在  Go
关注(0)|答案(8)|浏览(20)

你正在使用哪个版本的Go( go version )?

$ go version
go version go1.16beta1 darwin/amd64

这个问题在最新版本中是否重现?

是的

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/jayconrod/Library/Caches/go-build"
GOENV="/Users/jayconrod/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/jayconrod/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/jayconrod/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/opt/go/installed"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/opt/go/installed/pkg/tool/darwin_amd64"
GOVCS=""
GOVERSION="go1.16beta1"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/jayconrod/Code/test3/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/rq/x0692kqj6ml8cvrhcqh5bswc008xj1/T/go-build3849412287=/tmp/go-build -gno-record-gcc-switches -fno-common"

你做了什么?

运行 go list 或任何其他模块感知命令,该命令指向一个绝对或相对路径(以 ./ 开头),该路径指向单独模块内的子目录,该子目录提供替换。

go list ./sub
go list $(pwd)/sub

-- go.mod --
module example.com/m

go 1.16

require example.com/m/sub v0.0.0

replace example.com/m/sub v0.0.0 => ./sub
-- sub/go.mod --
module example.com/m/sub

go 1.16
-- sub/sub.go --
package sub

你期望看到什么?

go list 应该成功并打印包路径。在上面的示例中,它应该打印 example.com/m/sub

你看到了什么?

go list 以失败告终:

main module (example.com/m) does not contain package example.com/m/sub

看起来 go 命令在检查路径参数是否可能是另一个目录中替换模块的一部分之前,将路径解析为模块内的目录。

其他注意事项

这个问题与 golang-nuts 上的线程 go list across multiple modules 有关。

dojqjjoe

dojqjjoe1#

https://golang.org/cl/335269提到了这个问题:cmd/go: expand local directory in replace directive

qeeaahzv

qeeaahzv2#

这个提案是否仅覆盖子目录中的模块在主模块中被提及的情况?还是它将允许运行 go 命令,其中子目录的模块并未列在主模块中?例如,当前的 x/tools 仓库在 gopls 目录中有 golang.org/x/tools/gopls 模块,但不是 golang.org/x/tools 的依赖项。这项更改是否允许从仓库根目录开始工作的 go list ./gopls?

cmssoen2

cmssoen23#

这是否会改变从仓库根目录将go list ./gopls的工作?
不会,尽管错误消息可能应该说明原因。修复此问题后,go list(仍然)只能从构建列表中的模块加载包。

zaq34kh6

zaq34kh64#

在最近的提示中,go list 的行为似乎符合预期:
...\43733 目录具有问题中描述的结构。
子目录 sub 是主模块上下文中的子模块,也是模块上下文之外的包。用本地包替换所需的子模块似乎是从模块的Angular 来看的一个错误。

GOPATH\Issues\43733>gotip version
go version devel go1.18-95d0657670 Fri Nov 12 16:58:34 2021 +0000 windows/amd64

GOPATH\Issues\43733>set GO111MODULE
Environment variable GO111MODULE not defined

GOPATH\Issues\43733>gotip list
no Go files in GOPATH\Issues\43733

GOPATH\Google\Issues\43733>gotip list -m
example.com/m

example.com/m 是一个带有 go.mod 文件的主模块。

GOPATH\Google\Issues\43733>gotip list -m ...
example.com/m
example.com/m/sub v0.0.0 => ./sub

example.com/m/sub 在这个上下文中是一个子模块。它被替换为本地子目录中的包。

GOPATH\Google\Issues\43733>gotip list -m ./sub
go: cannot use relative path ./sub to specify module

GOPATH\Google\Issues\43733>gotip list ./sub
main module (example.com/m) does not contain package example.com/m/sub

由于 sub 目录在这个上下文中是一个包,不能将其作为模块列出,因此错误看起来是正确的。
当列出包时,主模块不包含包 example.com/m/sub,而是有一个带有 go.mod 文件的模块。因此存在错误。主模块需要一个实际上是子模块的包。

GOPATH\Google\Issues\43733>gotip list ...
archive/tar
(all golang packages)
example.com/m/sub

包含的目录被视为一个包。
当将 go.mod 设置为 1.16 或 1.17 时,结果没有发生变化。

5us2dqdw

5us2dqdw5#

这是Go1.18里程碑的内容。它有可能在1.18版本中实现吗?谢谢。

w6mmgewl

w6mmgewl6#

这是1.18里程碑的内容;现在要转向1.19了吗?谢谢。

icnyk63a

icnyk63a7#

从Go 1.18开始,这也与同一工作区中其他模块中的包的路径有关。
尽管如此,..../sub模式之间的交互可能会有点令人困惑。在原始示例中,./sub将解析为不同模块中的一个包,但./...会枚举该包吗?(今天不会。)

lx0bsm1f

lx0bsm1f8#

使用go1.18rc1并将go.mod版本设置为1.18,该问题的测试行为发生了变化,但似乎符合预期。
以下警告应被视为正确,因为子目录是一个模块(存在go.mod),而不是一个包。

>go list ./...
go: warning: "./..." matched no packages

当期望全部时:

>go list ...
archive/tar
... (abridged as all packages of go source are listed)
example.com/m/sub

相关问题