Golang中如果有人从GitHub上删除包会发生什么
Golang中如果有人从GitHub上删除包会发生什么 我在本地Unix系统中使用了github/amar/logger包(仅为示例),现在正将我的应用程序迁移到生产服务器。但该包已从GitHub仓库中移除。
那么在这种情况下会发生什么?
删除您的仓库或更改其可见性会影响该仓库的分支。
更多关于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” 事件的有效防御措施。
说得好。
但在这个案例中,我认为真正的问题在于该模块没有许可证。如果许可条款不明确,我不会想在生产环境中使用第三方模块。代理问题反而是次要的。
针对这种情况,有两种可能的解决方案。
-
托管你自己的 Go 代理。这是可行的,因为 Go 环境变量
GOPROXY可以设置为任意代理 URL,并且有现成的用于自托管的 Go 代理可用,或者可以轻松编写一个。(例如,可以参考 goproxyio/goproxy 或 gomods/athens 等。) -
使用 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
生产环境部署时应确保所有依赖都有备份或可靠的替代方案。

