如何解决`go mod vendor` 命令的目的是什么?
go mod vendor 命令在 主模块的根目录,包含所有包的副本 需要支持主模块中包的构建和测试。 仅通过对 main 之外的包的测试导入的包 模块不包括在内。
您还可以将供应商目录签入您的 VCS(版本 控制系统)。这在某种意义上变得有用,因为没有一个 依赖项需要在运行时下载,因为它已经存在 在供应商文件夹中签入 VCS
我认为模块 (go.mod
,go.sum
) 负责版本控制。我也觉得只有在第一次运行程序的时候才会下载依赖。
那么,命令 go mod vendor
有什么用?它的目的或用例是什么?
解决方法
Go Modules 负责版本控制,但不一定负责模块从 Internet 上消失或 Internet 不可用。如果模块不可用,则无法构建代码。
Go Proxy 将通过镜像模块在一定程度上缓解消失的模块,但它可能不会一直对所有模块都这样做:
为什么以前可用的模块在镜像中变得不可用?
proxy.golang.org 不会永远保存所有模块。造成这种情况的原因有很多,但一个原因是 proxy.golang.org 无法检测到合适的许可证。在这种情况下,只有模块的临时缓存副本可用,如果从原始源中删除并过时,则可能会变得不可用。校验和仍将保留在校验和数据库中,无论它们是否在镜像中变得不可用。
查看更多信息:https://proxy.golang.org/
另一种方法是 fork 模块并使用 Go Modules replace
directive 允许将导入路径重定向到另一个,例如您的 fork,在 go.mod
文件中,而无需更改您的代码。此方法由 colm.anseo 提供。
关于 Internet 访问,如果您运行一个大型服务器群并且需要在多台机器上使用代码,那么从 Internet 下载到您场中的每台机器可能效率低下并且存在安全风险。将 go mod vendor
用于内部存储库并复制它可能会更有效率。大公司使用内部方法将代码部署到其数据中心的多台服务器上。
这个问题给了我一个想法。有时我想知道一个模块有多“臃肿”
是的,所以我想要一种方法来查看模块的大小,但也可以查看任何三分之一
党进口。为此,我编写了下面的脚本,利用
go mod vendor
:
package main
import (
"bytes"
"fmt"
"io/fs"
"os"
"os/exec"
"path/filepath"
"strings"
)
func count(mod string) (int,error) {
imp := fmt.Sprintf("package main\nimport _%q",mod)
os.WriteFile("size.go",[]byte(imp),os.ModePerm)
exec.Command("go","mod","init","size").Run()
exec.Command("go","vendor").Run()
var count int
filepath.WalkDir("vendor",func(s string,d fs.DirEntry,err error) error {
if strings.HasSuffix(s,".go") && !strings.HasSuffix(s,"_test.go") {
data,err := os.ReadFile(s)
if err != nil {
return err
}
count += bytes.Count(data,[]byte{'\n'})
}
return nil
})
return count,nil
}
示例:
package main
func main() {
c,err := count("github.com/corona10/goimagehash")
if err != nil {
panic(err)
}
println(c)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。