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

1 回复

更多关于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项目的常见做法:

  1. 删除所有子目录中的go.mod文件
  2. 只保留根目录的go.mod
  3. 使用相对路径导入

根目录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项目,推荐使用单模块结构。多模块结构主要适用于:

  1. 需要独立版本控制的库
  2. 大型微服务架构
  3. 需要独立发布和版本控制的组件

对于你的学习项目,单模块结构更简单。示例结构:

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"
)

立即修复步骤

  1. 清理缓存:
go clean -modcache
  1. 为现有项目添加版本标签并推送

  2. 在新项目中更新依赖:

cd cmdline
go get github.com/stuartdd/goWebApp@v1.0.0
go mod tidy

多模块结构在Go中确实比较复杂,对于大多数项目,单模块结构是更简单和推荐的方式。

回到顶部