goland中使用go mod 会重复下载包

monsterzzz
  • 131

clipboard.png

clipboard.png

clipboard.png

这只是一个问题,当使用了go mod tidy之后会使得这个go-redis变成可以引入的了。
但是tidy命令是找到当前项目中没有下载的包并且下载或者没有依赖到的包删除掉。
可是我明明在这里已经下载好了go-redis了。

其实我只是想 我git clone 了别人的go项目,那么别人使用了go mod 我这边run的话,会把他项目里面所有我没有的包都给下载下来,之后我就可以随便在任何项目中使用了,而不是仅限于在我git clone下来的项目中。

clipboard.png

比如我在testsss这个项目中 import了 easy_go 这个包,并且go run 无错误。
那么我想在 helloWorld项目中 直接 import easy_go 就行 而不需要重新下载,也就是说goland能够直接找到我的包并且进行语法提示

回复
阅读 5.1k
3 个回答

肯定不行的啊。如果是 go mod 模式的话,识别效果是根据 go.mod 中的配置决定是否能识别补全的。而各个 module 之前都是独立的。也就是说,如果你想在写项目之前就能实现 easy_go 的补全的话,对应项目下的 go.mod 中必须已经声明这个依赖并且已经下载到 GOPATH/pkg/ 了。当然,同样的模块并且相同版本是不会重复下载,go.mod 中只是做了依赖的声明。如果熟悉 nodeJS 的话,可以与它对比下。

如果你已经看懂了,那么下面的都是废话。就不用继续看了,如果不懂,继续看吧!

这里可通过几个步骤完成:

首先,你需要通过 go mod init modname 把当前项目创建为 mod;

$ go mod init example.com/auto
go: creating new go.mod: module example.com/auto

目录下多了个 go.mod,查看下其中的内容,如下:

$ cat go.mod
module example.com/auto

go 1.12

然后,通过 go get github.com/sqrtcat/easy_go,将 easy_go 更新到你的 go.mod 文件。

$ go get github.com/sqrtcat/easy_go

再次查看 go.mod

$ cat go.mod
module example.com/auto

go 1.12

require github.com/sqrtcat/easy_go v0.0.0-20190717091231-f38efee9a600 // indirect

这句话有两个作用,一是如果依赖包没有下载,它会下载包,二是,如果它会将依赖加入到 go.mod 文件中,IDE 会根据这个文件中决定项目依赖的包。

最后,创建源码文件,在其中编写代码就可以做到自动识别补全了。

如果是写好代码,直接 go run/test/build,依赖是自动识别加入到 go.mod。但是在之前写代码的时候,go mod 文件中的内容还是空的,所以就做不到自动补全效果。

你要考虑到一种情况,那就是同一个项目其他组件依赖的第三方包跟你依赖的版本不一致怎么办的问题。

查一下你的环境变量GO111MODULE怎么设置的

宣传栏