go1.13 今天发布了,感觉 go module 比 GOPATH 难用

2019-09-04 16:30:04 +08:00
 wsseo
很多文章在介绍 go module 的时候都会提到“新手会疑惑为什么代码要放到 GOPATH 里”,以此引出 go module。
搜了一些关于 go module 的教程,还是有很多疑惑,感觉比 GOPATH 难理解。
用 GOPATH 的时候,需要什么包,提前安装到 GOPATH 就完事,代码补全由 vscode 插件完成。

以下是关于 go module 的疑问:
1.为什么 go mod init [module] 一定要指定 module,这个 module 名有什么意义,可以随便取吗
2.怎么导入当前工作空间的包
3.怎么导入其他目录的包
4.vscode 怎么使用 go module,以前代码补全直接到 GOPATH 目录下找
5.如果用 vscode 写一个新程序,go mod init,go mod tidy,go mod vendor 分别在哪个阶段执行



求一个容易理解的 go module 教程
13344 次点击
所在节点    Go 编程语言
42 条回复
aofei
2019-09-04 18:11:33 +08:00
@emeab 嗯嗯,我也发现了,不过目前我只能在 Go 分类下面回复消息…其他的都是 30 天限制…
blless
2019-09-04 18:15:40 +08:00
正版 goland 搞起来啊 vendor 加 go mod 天下无敌,加上私有仓库的 GOPRIVATE,个人企业我觉得都覆盖 90%以上需求了。其他语言自建仓库那个才叫麻烦
keyv
2019-09-04 18:17:48 +08:00
@wsseo #17 到 vscode-go 的 issues 里搜一下吧,已经有人提过这个了
ysicing
2019-09-04 18:23:20 +08:00
之前也是这样想。用了之后真香。
kiddingU
2019-09-04 18:26:17 +08:00
呵呵哒,你用了就知道
skiy
2019-09-04 18:29:52 +08:00
1.当你定义的 module 和 github.com 项目地址相同时,引入的当前项目路径跟正常的 gopath 没两样,即可以决定是否使用 go mod
2. 看文档
3. 在本项目中均可引入,方法同 2
4. vscode 得依靠插件
5. 肯定 init 初始化,tidy 是清理 gomod 引入包的,vendor (暂时没用过)最后使用
snxq1995
2019-09-04 18:30:52 +08:00
@aofei 遇到大佬,膜拜。
skiy
2019-09-04 18:32:37 +08:00
另外,你说 gopath 好用?当你 a 项目要用的扩展包是 v1 版本,b 项目要用 v2 版本时或者扩展包的 master 有更新时,你咋整?在家跟在公司的环境就变了
snxq1995
2019-09-04 18:34:54 +08:00
dbskcnc
2019-09-04 21:04:37 +08:00
说 gopath 比 go mod 好用那真的侮辱别人的智商,对于解决实际问题,go mod 比 gopath 好用 100 倍不止,光自动下载依赖这一点就值

lz 提的问题一部分是自己的问题,一部分是生态的问题,不过毕竟 go mod 确实新出,确实需要一些时间给人适应
reus
2019-09-04 21:07:28 +08:00
你都没掌握它的用法,就不要评价什么了
官方 wiki 就很好: https://github.com/golang/go/wiki/Modules
solos
2019-09-04 22:55:08 +08:00
go module 感觉特别好用啊 以前用 glide 有时候有点小问题
T3RRY
2019-09-05 08:11:28 +08:00
go module 才是解决了 gopath 不好用的问题!
很奇怪为什么还在认为 gopath 好用
Hanggi
2019-09-05 08:15:43 +08:00
你问的这些问题都不是问题,谷歌搜一下就好了
SpiderShrimp
2019-09-05 08:55:04 +08:00
go 1.12 就该用 go module 了
lrh3321
2019-09-05 09:41:02 +08:00
go 1.12 暂时不打算升 1.13.不过早就用上 go module 了
linxl
2019-09-05 10:00:00 +08:00
就几个命令...
Pythondr
2019-09-05 10:47:56 +08:00
1. 理论上 go mod init 时的 module 名可以随便取, 但是如果是要作为一个包被其它项目引用,那么就必须遵守一定的规范了,不然到时候 go mod 是引用不到的。打个比方, 如果你的包是托管在 github 上, 那么你的 go module 名就应该是 github.com/xxx/package_name。
2. 导入当前项目的包也很简单, 就是将你的 go mod 名作为项目根目录就行了
3. 如果需要导入本地包的化,就需要用到 go mod 的 replace 了, 但是一般不推荐这么做,貌似 replace 只支持绝对路径,这就给协同开发带来了不便,所有建议把包都用 go mod 来管理吧。
5. init 是初始化 gomod, tidy 是下载引用包,清除无用包,vendor 是将项目中所有的引用包 copy 到当前项目下的 vendor 目录中来。
wsseo
2019-09-05 11:23:59 +08:00
@Pythondr
3.本地其他包也用 go mod 管理,包引用的时候还是要用 replace,不然找不到?
如果所有包都要搞 cvs,感觉很蹩脚。
wsseo
2019-09-05 15:04:19 +08:00
3.用 replace 导入自己的包,可以编译运行,只是 vscode gplsp 各中问题,导入报错,函数没补全

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/597907

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX