Golang从现有GitHub项目导入时遇到'unknown revision'错误如何解决
Golang从现有GitHub项目导入时遇到’unknown revision’错误如何解决
背景
我使用 GO 1.22.1、Linux Mint 和 VSCode 作为开发工具。我曾是一名多年的 Java 开发者。我认为 GO 语言是自切片面包以来最棒的东西 😊
GO 语言本身易于学习,但包管理确实令人困惑!
我有一个大型的 GO 项目,开发它主要是为了学习 Go,而非其他目的。它是一个为我的树莓派编写的简单 Web 服务器。
我将项目托管在 GitHub 上,并且一直进展顺利,直到现在。
我有一个主文件 goWebApp.go 和主目录下的 7 个包。对于主应用程序,我在 go.mod 文件中使用 replace 指令,以便可以在本地工作。
最初,我没有在子“包”中放置 go.mod 文件,但在某些包导入其他包时遇到了困难。
项目位于 http://github.com/stuartdd/goWebApp。请不要过于苛刻,这多年来一直是我的试验场。
-----goWebApp
| config # 包 - 无内部依赖
----| config.go
| go.mod
| controllers # 包依赖于 runCommand 和 config
----| controllers.go
| go.mod
| image # 包 - 无内部依赖
----| image.go
| go.mod
| runCommand # 包 - 无内部依赖
----| runCommand.go
| go.mod
ETC.
goWebApp.go
go.mod # 如下所列
module github.com/stuartdd/goWebApp
go 1.22.0
replace github.com/stuartdd/goWebApp/config => ./config
replace github.com/stuartdd/goWebApp/server => ./server
replace github.com/stuartdd/goWebApp/logging => ./logging
replace github.com/stuartdd/goWebApp/controllers => ./controllers
replace github.com/stuartdd/goWebApp/runCommand => ./runCommand
replace github.com/stuartdd/goWebApp/pictures => ./pictures
replace github.com/stuartdd/image => ./image
require (
github.com/stuartdd/goWebApp/config v1.0.0
github.com/stuartdd/goWebApp/logging v1.0.0
github.com/stuartdd/goWebApp/pictures v1.0.0
github.com/stuartdd/goWebApp/server v1.0.0
)
require (
github.com/stuartdd/goWebApp/controllers v1.0.0 // indirect
github.com/stuartdd/goWebApp/runCommand v1.0.0 // indirect
)
注意:
没有生成 go.sum 文件,我经常从命令行构建和运行。
我曾尝试不在包中使用 go.mod 文件,但无法将 runCommand 和 config 导入到 controllers 中。
我已经创建了一个 v1.0.0 版本。
当前问题:
我现在正在创建一个命令行工具,并希望重用 goWebApp 项目中的包/模块代码,但我完全无法导入这些代码。
我的新项目的 go.mod 如下:
module github.com/stuartdd/cmdline
go 1.22.0
require github.com/stuartdd/goWebApp v1.0.0
当我运行 go mod tidy 时,得到以下输出:
go: downloading github.com/stuartdd/goWebApp/config v0.0.0
go: downloading github.com/stuartdd/goWebApp/server v0.0.0
go: downloading github.com/stuartdd/goWebApp/pictures v0.0.0
go: downloading github.com/stuartdd/goWebApp/logging v0.0.0
go: github.com/stuartdd/cmdline imports
github.com/stuartdd/goWebApp imports
github.com/stuartdd/goWebApp/config: reading github.com/stuartdd/goWebApp/config/go.mod at revision config/v0.0.0: unknown revision config/v0.0.0
go: github.com/stuartdd/cmdline imports
github.com/stuartdd/goWebApp imports
github.com/stuartdd/goWebApp/logging: reading github.com/stuartdd/goWebApp/logging/go.mod at revision logging/v0.0.0: unknown revision logging/v0.0.0
go: github.com/stuartdd/cmdline imports
github.com/stuartdd/goWebApp imports
github.com/stuartdd/goWebApp/pictures: reading github.com/stuartdd/goWebApp/pictures/go.mod at revision pictures/v0.0.0: unknown revision pictures/v0.0.0
go: github.com/stuartdd/cmdline imports
github.com/stuartdd/goWebApp imports
github.com/stuartdd/goWebApp/server: reading github.com/stuartdd/goWebApp/server/go.mod at revision server/v0.0.0: unknown revision server/v0.0.0
我已经清理了缓存和 modcache,但没有效果。
如果我将 go.mod 改为 require github.com/stuartdd/goWebApp v0.0.0,我会得到:
go: downloading github.com/stuartdd/goWebApp v0.0.0
go: github.com/stuartdd/cmdline imports
github.com/stuartdd/goWebApp: reading github.com/stuartdd/goWebApp/go.mod at revision v0.0.0: unknown revision v0.0.0
我已经尝试了好几天,搜索、阅读、测试,然后重复这个过程…
问题
我是否可以在另一个项目中包含 goWebApp 中的模块/包,还是必须为每个我想要重用的模块创建新的仓库?
我相信我已经正确地构建了 goWebApp,在 go.mod 文件中使用了 GitHub 上有效的模块名称,那么我哪里做错了?
对于一个更复杂的项目,最佳(且最新的)结构方式是什么?我阅读的很多资料都是针对旧版本的 GO,现在已经不再有效!
此致
更多关于Golang从现有GitHub项目导入时遇到'unknown revision'错误如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang从现有GitHub项目导入时遇到'unknown revision'错误如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这个错误是因为你的子模块没有正确的版本标签。Go模块系统需要明确的版本号来下载依赖,而你的子模块只有本地replace指令,没有在GitHub上发布实际版本。
问题在于你的goWebApp项目使用了多模块结构,但子模块没有独立版本。当其他项目引用时,Go会尝试下载这些子模块,但GitHub上不存在对应的版本标签。
解决方案
方案1:为子模块创建版本标签(推荐)
在你的GitHub仓库中为每个子模块创建tag:
# 在goWebApp项目根目录执行
git tag config/v1.0.0
git tag logging/v1.0.0
git tag server/v1.0.0
git tag pictures/v1.0.0
git tag controllers/v1.0.0
git tag runCommand/v1.0.0
git tag image/v1.0.0
# 推送所有tag到GitHub
git push origin --tags
然后更新主go.mod文件,移除replace指令,使用实际的版本:
module github.com/stuartdd/goWebApp
go 1.22.0
require (
github.com/stuartdd/goWebApp/config v1.0.0
github.com/stuartdd/goWebApp/logging v1.0.0
github.com/stuartdd/goWebApp/pictures v1.0.0
github.com/stuartdd/goWebApp/server v1.0.0
github.com/stuartdd/goWebApp/controllers v1.0.0
github.com/stuartdd/goWebApp/runCommand v1.0.0
github.com/stuartdd/goWebApp/image v1.0.0
)
方案2:使用单模块结构(更简单)
重构项目为单模块结构,这是Go项目的常见做法:
- 删除所有子目录中的go.mod文件
- 只保留根目录的go.mod
- 使用相对路径导入
根目录go.mod:
module github.com/stuartdd/goWebApp
go 1.22.0
导入示例:
// 在controllers.go中
import (
"../config"
"../runCommand"
)
方案3:使用replace指令指向本地路径(仅开发用)
在新项目的go.mod中添加replace指令:
module github.com/stuartdd/cmdline
go 1.22.0
require github.com/stuartdd/goWebApp v1.0.0
replace github.com/stuartdd/goWebApp => ../goWebApp
replace github.com/stuartdd/goWebApp/config => ../goWebApp/config
replace github.com/stuartdd/goWebApp/server => ../goWebApp/server
// ... 其他子模块的replace指令
最佳实践建议
对于大多数Go项目,推荐使用单模块结构。多模块结构主要适用于:
- 需要独立版本控制的库
- 大型微服务架构
- 需要独立发布和版本控制的组件
对于你的学习项目,单模块结构更简单。示例结构:
goWebApp/
├── cmd/
│ └── webserver/
│ └── main.go
├── internal/
│ ├── config/
│ ├── controllers/
│ ├── logging/
│ └── server/
├── pkg/
│ ├── runCommand/
│ └── image/
├── go.mod
└── go.sum
这样你可以直接导入:
import (
"github.com/stuartdd/goWebApp/internal/config"
"github.com/stuartdd/goWebApp/pkg/runCommand"
)
立即修复步骤
- 清理缓存:
go clean -modcache
-
为现有项目添加版本标签并推送
-
在新项目中更新依赖:
cd cmdline
go get github.com/stuartdd/goWebApp@v1.0.0
go mod tidy
多模块结构在Go中确实比较复杂,对于大多数项目,单模块结构是更简单和推荐的方式。

