go mod 机制到底如何运作的

1.go mod 允许在$GOPATH路径外 建立文件夹 go mod init 模块名称 譬如 github.com/walkmiao/testgomod
那么将会在此目录下生成go.mod文件。随后如果添加一个文件并写入代码提交到远程仓库。
第一个问题想问的是 这里的模块名称远程仓库名称是否必须要一致?这里我不知道这个模块名称有什么用。

2.然后我又新建一个mod管理项目usergomod,使用之前的testgomod下的包。在我测试完后,我删除了本地 $GOPATH/pkg/mod下的所有东西 并且也删除了远程仓库。为什么在usegomod目录下go build依然能够拉取之前的mod。真是百思不得其解

阅读 4.6k
2 个回答

1) module name 是你在程序中引用一个 module 用的名字。import 的时候是可以改的。 path 是告诉程序去哪里找到这个 module 。两者并不一定一致,但是通常推荐一致。

2) pkg/mod 是你的依赖。go build 甚至并不需要你自己的 module 在 git 控制下。但是依赖的话,会顺着 import 的路径去远程仓库拉取,然后放在 pkg/mod 里。

其实也可以为依赖指定本地路径,这样就不去远程仓库拉了。详见 When should I use the replace directive?

新手上路,请多包涵

2)为什么删除远程仓库和本地$GOPATH/pkg/mod后 重新go build依然可以拉取模块
我想从这个图中可以看到GOPROXY在向远程仓库拉取的时候 自己也保留了一份cache,那么之后的拉取如果GOPROXY上有的话 就会直接从GOPROXY返回给使用者。
防止由于项目依赖某作者的模块,但是模块被作者删除而被Break掉的情况

图片描述

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题