Golang中如何从工作区仓库使用`go get`获取模块?

Golang中如何从工作区仓库使用go get获取模块? 我运行了以下命令:

go get -u github.com/keyval-dev/odigos/odiglet@v1.0.0

命令的输出是:

go: module github.com/keyval-dev/odigos@v1.0.0 found, but does not contain package github.com/keyval-dev/odigos/odiglet

如果你查看GitHub上的仓库这里,很明显 github.com/keyval-dev/odigos 不是一个模块,因为该目录下没有 go.mod 文件,而 github.com/keyval-dev/odigos/odiglet 也不是一个包,因为它包含了 go.mod 文件。为什么我会看到这个错误?这与在根目录找到的 go.work 文件有关吗?

我尝试查看了 pkg.go.dev(抱歉我无法包含链接,因为论坛在我这样做时会显示错误),它向我显示了3个版本,例如 v0.0.0-20231114115523-e928e15a4738,但缺少仓库中标记的版本。

这说得通吗?我遗漏了什么?

我真的感到很困惑。任何帮助都将不胜感激 祈祷


更多关于Golang中如何从工作区仓库使用`go get`获取模块?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

我已经添加了标签 odiglet/v1.0.0,它似乎解决了这个问题。

更多关于Golang中如何从工作区仓库使用`go get`获取模块?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go工作区(workspace)中使用 go get 获取子模块时,需要明确指定子模块的完整模块路径。根据你提供的信息,github.com/keyval-dev/odigos/odiglet 是一个独立的模块(有自己的 go.mod),因此应该直接使用该路径进行获取。

错误信息表明Go工具在根目录找到了 github.com/keyval-dev/odigos 模块,但该模块不包含 odiglet 包。这是因为 odiglet 是子模块而非子包。以下是解决方案:

// 正确命令:
go get -u github.com/keyval-dev/odigos/odiglet@v1.0.0

如果仍然遇到问题,可能是以下原因:

  1. 版本标签未推送到子模块:确保 v1.0.0 标签存在于子模块中。检查仓库的标签位置:
# 查看远程标签
git ls-remote --tags origin | grep odiglet
  1. 工作区配置影响:如果根目录存在 go.work 文件,Go工具会优先使用工作区模式。可以临时禁用工作区:
# 方法1:设置环境变量
GOWORK=off go get -u github.com/keyval-dev/odigos/odiglet@v1.0.0

# 方法2:移动到工作区外执行
cd /tmp
go get -u github.com/keyval-dev/odigos/odiglet@v1.0.0
  1. 直接使用完整模块路径:明确指定子模块路径:
// 在go.mod中手动添加
require github.com/keyval-dev/odigos/odiglet v1.0.0
  1. 检查代理中的模块可用性
# 查询模块信息
go list -m -versions github.com/keyval-dev/odigos/odiglet

如果pkg.go.dev显示的是伪版本(如 v0.0.0-20231114115523-e928e15a4738)而非 v1.0.0,说明该标签可能未正确发布到子模块。在这种情况下,可以使用伪版本或提交哈希:

go get github.com/keyval-dev/odigos/odiglet@e928e15a4738

工作区模式(go.work)确实会影响模块解析行为。Go工具在工作区中会尝试使用本地文件系统路径而非远程仓库。如果问题持续,建议检查工作区配置或暂时禁用工作区功能。

回到顶部