您使用的是哪个版本的rules_go?
0.42.0
您使用的是哪个版本的gazelle?
0.33.0
您使用的是哪个版本的Bazel?
6.4.0
此问题是否会在上述所有最新版本中重现?
是的
您使用的是什么操作系统和处理器架构?
MacOS索诺马/苹果M2 Pro
你做了什么
升级到go 1.21,现在当我运行bazel build //...
时,我的程序使用的所有外部go模块都会抛出与1.18 https://go.dev/doc/tutorial/workspaces中引入的新工作区模式相关的错误:
x1c 0d1x的数据
我该如何解决这个问题?没有可行的方法将该目录中使用的所有模块添加到go.work
文件中。2有没有方法关闭这个新的工作区模式?
1条答案
按热度按时间9jyewag01#
在我看来,错误消息是:
字符串
这表明Bazel构建中针对来自
com_github_klosmo_atlas_app_toolkit_v2
存储库的Go包的编译失败。错误消息特别提到了
errfields
包中未定义的标识符,如FieldInfo
和StringListValue
。这表明代码中可能缺少依赖项或导入路径不正确。不,问题不是拉入目标仓库,问题是Bazel将仓库符号链接到
/private/var/tmp/_bazel_/external/
目录,并从那里构建所有目标-随着go xml 4的出现,这些被认为是我项目的外部模块;因此抛出错误,因为我没有使用go.work
文件来引用这些“外部”模块。我不可能以这种方式手动引用每一个go模块,所以我想知道是否有一个解决方案。
因此,问题来自Go的新工作区模式与Bazel处理外部依赖项的方式之间的交互,Bazel通过将它们符号链接到单独的目录(
outputRoot
directory)中来处理外部依赖项。这种行为导致Go将这些依赖项视为外部模块,这反过来会在go.work
文件未用于引用这些模块时触发错误。作为一种解决方法,您可以考虑创建一个脚本,设置从Bazel构建目录到Go工作区的必要符号链接,模仿Go工作区模式所期望的布局。
这个脚本可以作为预构建步骤运行(有点像in this question,关于bazel预构建步骤)。
型
或者,您可以根据
go.mod
文件或Bazel构建文件中指定的依赖项自动生成go.work
文件。此脚本可以扫描项目的依赖项,并自动生成引用所有必需模块的go.work
文件。型
由于
bazelbuild/bazel-gazelle
有一个“非常简约的支持go example”(PR 1250),这可能会有所帮助。