你正在使用哪个版本的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 有关。
8条答案
按热度按时间dojqjjoe1#
https://golang.org/cl/335269提到了这个问题:
cmd/go: expand local directory in replace directive
qeeaahzv2#
这个提案是否仅覆盖子目录中的模块在主模块中被提及的情况?还是它将允许运行
go
命令,其中子目录的模块并未列在主模块中?例如,当前的x/tools
仓库在gopls
目录中有golang.org/x/tools/gopls
模块,但不是golang.org/x/tools
的依赖项。这项更改是否允许从仓库根目录开始工作的go list ./gopls
?cmssoen23#
这是否会改变从仓库根目录将go list ./gopls的工作?
不会,尽管错误消息可能应该说明原因。修复此问题后,
go list
(仍然)只能从构建列表中的模块加载包。zaq34kh64#
在最近的提示中,
go list
的行为似乎符合预期:...\43733 目录具有问题中描述的结构。
子目录 sub 是主模块上下文中的子模块,也是模块上下文之外的包。用本地包替换所需的子模块似乎是从模块的Angular 来看的一个错误。
example.com/m
是一个带有 go.mod 文件的主模块。example.com/m/sub
在这个上下文中是一个子模块。它被替换为本地子目录中的包。由于
sub
目录在这个上下文中是一个包,不能将其作为模块列出,因此错误看起来是正确的。当列出包时,主模块不包含包
example.com/m/sub
,而是有一个带有 go.mod 文件的模块。因此存在错误。主模块需要一个实际上是子模块的包。包含的目录被视为一个包。
当将 go.mod 设置为 1.16 或 1.17 时,结果没有发生变化。
5us2dqdw5#
这是Go1.18里程碑的内容。它有可能在1.18版本中实现吗?谢谢。
w6mmgewl6#
这是1.18里程碑的内容;现在要转向1.19了吗?谢谢。
icnyk63a7#
从Go 1.18开始,这也与同一工作区中其他模块中的包的路径有关。
尽管如此,
...
和./sub
模式之间的交互可能会有点令人困惑。在原始示例中,./sub
将解析为不同模块中的一个包,但./...
会枚举该包吗?(今天不会。)lx0bsm1f8#
使用
go1.18rc1
并将go.mod版本设置为1.18,该问题的测试行为发生了变化,但似乎符合预期。以下警告应被视为正确,因为子目录是一个模块(存在go.mod),而不是一个包。
当期望全部时: