Golang中如果有人从GitHub上删除包会发生什么

Golang中如果有人从GitHub上删除包会发生什么 我在本地Unix系统中使用了github/amar/logger包(仅为示例),现在正将我的应用程序迁移到生产服务器。但该包已从GitHub仓库中移除。

那么在这种情况下会发生什么?

9 回复

删除您的仓库或更改其可见性会影响该仓库的分支。

更多关于Golang中如果有人从GitHub上删除包会发生什么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个很好的观点,这适用于你事先知道这些分支,或者通过 GitHub 之外的在线搜索找到它们的情况。

那么,如果我告诉你,我过去六个月一直在开发一个应用程序,当我将其部署到生产环境并为其创建了持续集成/持续部署流程后,软件包却被删除了。那我该怎么办?

我知道我可以在本地构建应用程序。

我想指出,如果该仓库有分支,并且这些分支是合适的替代方案,你可以使用其中一个分支作为替代吗?此外,如果该仓库对你来说足够重要,你可以自行创建分支以拥有一份副本作为备份(除了本地副本之外,还可以在网络上/GitHub上保留一个分支副本)。

只要您不需要重新构建,就不会有任何问题。但是,如果您必须重新构建,除非您仍然拥有该仓库的副本,可以将其与您的源代码一起“vendor”,否则将无法进行。

// 代码示例(如有)应放在此处

@christophberger,感谢您的回复。

这正是我所寻找的确切回答。非常感谢您的帮助。

但是,proxy.golang.org 并不会永久保存所有模块。这有多种原因,其中一个原因是如果 proxy.golang.org 无法检测到合适的许可证。在这种情况下,只会提供模块的临时缓存副本,并且如果该模块从原始源中移除并变得过时,它可能会变得不可用。

你好 @Amardeep_Saini

如果该仓库是一个 Go 模块,它将继续通过 Go 团队的 Go 代理服务器(或者,如果你的 Go 环境配置为使用其他代理服务器,则通过任何其他 Go 代理服务器)保持可用。

唯一的要求是该模块(或者更准确地说,模块的特定版本)曾经被下载过一次(无论由谁下载)。从那时起,代理服务器就会缓存该模块。

因此,Go 代理服务器是防止类似 “left-pad” 事件的有效防御措施。

说得好。

但在这个案例中,我认为真正的问题在于该模块没有许可证。如果许可条款不明确,我不会想在生产环境中使用第三方模块。代理问题反而是次要的。

针对这种情况,有两种可能的解决方案。

  1. 托管你自己的 Go 代理。这是可行的,因为 Go 环境变量 GOPROXY 可以设置为任意代理 URL,并且有现成的用于自托管的 Go 代理可用,或者可以轻松编写一个。(例如,可以参考 goproxyio/goproxygomods/athens 等。)

  2. 使用 vendoring。诚然,Go 代理应该让 vendoring 变得不必要,但如果代理无法满足你的需求,vendoring 可能是一个可行的替代方案。

除此之外,所有正在使用的模块也会在 $(go env GOPATH) 路径下进行本地缓存。因此,在(不太可能发生的)情况下,如果有人从 GitHub 上删除了某个模块,而你恰好需要那个模块,你仍然可以在本地模块缓存中找到所有文件。如果其他方法都行不通,你可以从那里获取文件,并将它们移动到生产 CI/CD 流水线能够找到的位置。

当依赖的GitHub仓库被删除时,会产生以下具体影响:

1. 直接依赖问题

// go.mod 示例
module myapp

go 1.21

require github.com/amar/logger v1.2.0

如果仓库被删除:

  • go mod download 会失败
  • go build 会报错:cannot find module providing package github.com/amar/logger
  • 新环境部署时会直接失败

2. 解决方案示例

方案A:使用replace重定向到镜像或备份

// go.mod 修改
module myapp

go 1.21

require github.com/amar/logger v1.2.0

replace github.com/amar/logger => ./vendor/github.com/amar/logger
// 或重定向到备份仓库
replace github.com/amar/logger => github.com/backup/logger v1.2.0

方案B:本地vendor备份

# 在仓库删除前备份
go mod vendor
# 或手动复制
mkdir -p vendor/github.com/amar
cp -r $GOPATH/pkg/mod/github.com/amar/logger@v1.2.0 vendor/github.com/amar/logger

方案C:寻找替代包并修改代码

// 原代码
import "github.com/amar/logger"

func main() {
    log := logger.New()
    log.Info("message")
}

// 修改为替代包
import "github.com/sirupsen/logrus"

func main() {
    log := logrus.New()
    log.Info("message")
}

3. 预防措施代码示例

// 使用go.mod的retract指令(如果你是包作者)
// 在包的go.mod中声明
module github.com/amar/logger

go 1.21

retract v1.2.0 // 严重bug,请升级到v1.2.1
# 使用athens等代理缓存
GOPROXY=https://athens.example.com,direct
# 或使用官方代理
GOPROXY=https://proxy.golang.org,direct

# 锁定依赖版本
go mod tidy
go mod vendor
git add vendor/ go.mod go.sum

4. 当前紧急处理

如果已经发生删除:

# 检查本地缓存是否还有副本
ls $GOPATH/pkg/mod/github.com/amar/logger@*

# 如果有,复制到vendor目录
cp -r $GOPATH/pkg/mod/github.com/amar/logger@v1.2.0 ./vendor/github.com/amar/logger/

# 修改go.mod使用本地vendor
echo 'replace github.com/amar/logger => ./vendor/github.com/amar/logger' >> go.mod

生产环境部署时应确保所有依赖都有备份或可靠的替代方案。

回到顶部