Gopher,你是否每次装包都得打开 GitHub 去搜索,然后 Copy 包的地址,最后再 go get github.com/xxx/xxx,是不是太麻烦了。
对于一些常用的包,我们知道他的名字,但是却记不住他的全路径,所以每次都会重复上述场景。
现在 goget 来解决这个问题。
传统方式:go get -u github.com/gin-gonic/gin
便捷方式:goget gin
1
banishee 2020-07-23 11:42:24 +08:00
我觉得 go module 很香了,虽然要先 clone 项目
|
2
janxin 2020-07-23 11:45:00 +08:00
有两个包叫一个名字怎么解决...
比如 gin 和 gin/v2 比如两个包都叫 errors |
5
also24 2020-07-23 11:50:52 +08:00
|
6
saltbo OP @also24 是的 就是基于 pkg.go.dev 的搜索做的,技术上很简单,就是为了便捷操作而已~
|
8
Leigg 2020-07-23 12:01:52 +08:00 via Android
要做就做到足够好,参考 docker 的包管理可以参考
|
9
Leigg 2020-07-23 12:02:01 +08:00 via Android
要做就做到足够好,docker 的包管理可以参考
|
10
imnaive 2020-07-23 12:22:33 +08:00
如果不是 github.com/* 开头的,像 golang.org/* 还能用吗
|
12
reus 2020-07-23 12:55:07 +08:00
以前用 godoc.org ,现在用 pkg.go.dev ,谁用 github 啊……
pkg.go.dev 搜索之后,双击选中,复制粘贴,就行了 其实绝大部分时候,goimports 或者 gopls 或者 goland 都能自动补全 import path,根本不需要 go get 没有击中痛点,不用。 |
15
SingeeKing 2020-07-23 13:22:35 +08:00
建议增加类似于「自定义词典」的功能(最好是选择时候就询问是否自动记忆)和「自动使用最新大版本」的配置
|
16
huobazi 2020-07-23 13:27:14 +08:00
没有 ruby gems 和 .net nuget 和 flutter pub 那样的东西吗?
|
17
reus 2020-07-23 13:36:01 +08:00 2
@huobazi 当然有,而且是官方提供的工具。楼主就是写了个几十行的包装官方工具的小程序,就声称比官方工具更方便。作为 go 的使用者,我认为这个工具没啥用,结果楼主很不乐意。
|
19
gravitybox 2020-07-23 13:59:35 +08:00
go mod
|
21
kidlj 2020-07-23 14:47:20 +08:00
tj 做的 https://gobinaries.com
|
22
chennqqi 2020-07-23 14:48:21 +08:00
export GOPROXY=https://goproxy.cn 不香吗
|
25
lasuar 2020-07-23 15:00:51 +08:00
$ go get github.com/saltbo/goget
go: github.com/saltbo/[email protected]: parsing go.mod: unexpected module path "github.com/saltbo/gomods" go: error loading module requirements |
27
chennqqi 2020-07-23 16:36:11 +08:00
|
29
Kr98 2020-07-23 17:17:21 +08:00
@saltbo 不需要 go get 这个命令的。
第一次使用在代码里写一下 import 地址,go module 会自动下载。 第二次使用你在代码里写'gin',goimports 会自动帮你修改 import 列表。 |
31
Kr98 2020-07-23 17:32:17 +08:00 via Android
@saltbo 只要你的机器上装过一次某个库,goimports 都会自动导入,新项目也一样,所以不存在重复找地址的情况。
|
33
Vegetable 2020-07-23 17:40:01 +08:00
@saltbo #30 go mod 的流程一般是先在文件里 import,如果本地已经有了这个包(一般常用的包本地用过就会缓存下来),可以直接补全的,go mod 自己会处理后续。只有本地没有的情况下才需要手动写 import 完整地址,但是这情况还是比较少见的。换句话说,go mod 环境不需要显式 go get,你如果做一个 ide 插件聚焦在搜索上,会更好用一点,这种命令行工具,可能的确很多人不感冒。
|
36
zhs227 2020-07-23 17:53:30 +08:00
我见过不少 GO 的库自身是带有一个工具的,而这个工具经常也是需要安装的。比如用来生成脚手架代码等,工具还是挺 好用的。只是不扶墙连不上。
|
37
Vegetable 2020-07-23 18:00:47 +08:00
@saltbo #35 我是 VScode+Language Server,我倒也不知道这个自动 import 是哪个工具提供的,反正能用。
|
39
saltbo OP @Vegetable 我不喜欢用 vscode 写 go 但是我想了解下 既然你用 go mod 了 那么当你新建一个项目然后执行 go mod init newproject 这个时候你去 main.go 里写 gin. 会自动导入么?
|
40
Vegetable 2020-07-23 18:11:56 +08:00
@saltbo #39 会的,前提是我本地用过 gin 这个包,输出 gin 就会出现补全 Enter 就导入了,也可以直接访问方法。
如果完全没用过的包,像上边有人提到的更换开发机的话,需要手动处理一次。 |
43
renmu123 2020-07-23 18:26:17 +08:00 via Android
从别的语言过来的开发者很奇怪 go 竟然没有中心化的包管理工具,好处也是有的,那就是好的包命名不担心被别人抢了(笑
|
44
saltbo OP @renmu123 这个优点我觉得很好啊,像 rust 里的 crypto 就被人抢占了,但是后面又不维护了,结果就是还有个 rust-crypto 。但是对于刚接触这块儿的人来说最开始肯定是以为 crypto 更好~~
|
46
HsiungWang 2020-07-23 19:31:31 +08:00 via iPhone
顶楼主,老阴阳人太多了。觉得不爽,你贴一个自己的让其他人掌掌眼,别说那种不会制冰还不能评论电冰箱,这不是一回事。
|
47
reus 2020-07-23 19:47:39 +08:00
@Kr98 我一开始就和楼主讲了,结果说了半天居然还觉得有人用 GOPATH 。再说了,就算我把 gin 的导入地址打全了,下次要用,zsh 、fish,甚至 bash 都会记得,直接就能补全。实在没有用这个工具的需要,说了半天都不信,还在那自珍。
|
48
nextvay 2020-07-23 20:38:10 +08:00
香~ 已下载
|
49
ysmood 2020-07-23 21:18:38 +08:00
感觉所有 go 的 IDE 都支持的很好了,基本都是自动 import 了,如何说服大家不用 IDE 呢?
|
50
saltbo OP #37 楼这个截图我刚看到 VScode+Language Server 这个我没用过,具体不太清楚。
关于 Goland,经过我测试。 1. 如果你勾选了 Enable Go Modules integration,这时候就算之前在别的项目里 go get 过同一个包,那也是不会在新项目里自动导入的。 2. 如果你关闭了 Enable Go Modules integration,这时候如果之前的项目里 go get 过,在新项目里就可以自动导入了。因为这时候你实际上还是用的 GOPATH (不论项目下有没有 go.mod ) 除以上情况,如果你们还能自动导入,可以教教我~ |
52
ysmood 2020-07-23 21:45:28 +08:00
@saltbo 所以我建议你转个 vscode 试试,我从来只用 module 。哪位朋友的截图你也看到了,是有 go.mod 文件的。
我的意思是 edge case 不足够成为真正的痛点。我安装你这个比如花费 1 分钟。但是我一个月可能只用一次,对于有洁癖的人来说意义在哪呢。 再说了这个功能如此简单,那么多 goland 付费用户,只要去提个需求,人家自动 import 很快就能加上了。 https://github.com/golang/vscode-go/issues/398 如果需要额外功能,不如去 IDE 的网站给人家提个 issue,或者贡献代码给 IDE 项目。 当然如果你要的功能确实和社区矛盾了,那确实该自己发明轮子。但目前的信息上来看合作是更好的方式。 |
54
jinliming2 2020-07-23 22:51:11 +08:00 4
@saltbo 首先,使用 Go modules 之后,GOPATH 是依旧存在的。
根据最新的 go 基础文档 https://golang.org/doc/code.html,你安装的第三方包都会被下载到 GOPATH 下的 pkg/mod 目录中: Module dependencies are automatically downloaded to the pkg/mod subdirectory of the directory indicated by the GOPATH environment variable. The downloaded contents for a given version of a module are shared among all other modules that require that version, so the go command marks those files and directories as read-only. goimports 会根据 $GOPATH/pkg/mod 下已经安装过的包来实现自动导入(前提是你的项目包含 go.mod ,是一个 Go Modules 项目,否则 goimports 也不会帮你),而 goimports 属于 go 官方工具,所以可以认为是官方的行为。 再说 Goland,在 Go modules 之前,go 要求将项目都放在 $GOPATH/src 下,这也就是“GOPATH 开发模式”的由来。在 Go modules 出来之后,Goland 区分两种模式,Go 和 Go Modules 。 Go 模式,你的项目必须放在 $GOPATH/src 下( Goland 提供了项目 GOPATH 功能,可以临时设置项目路径为 GOPATH ),然后你 go get 的包也会存在 $GOPATH/src 下,这样 Goland 就可以自动导入 $GOPATH/src 下的包了。 而 Go Modules 模式下,Goland 就完全只认 go.mod 中有的包,go.mod 中没有的包完全不认,不会自动去 $GOPATH/pkg/mod 中导入。 但是 Goland 在代码中右键 -> Go Tools -> Goimports File 却可以自动去 $GOPATH/pkg/mod 导入的,因为这个功能调用的是官方的 goimports 工具。但是虽然自动导入了,Goland 依旧显示为红色,不认,你还得再右键 Show Context Actions -> Sync dependencies 同步一遍。 由此,我认为这是 Goland 没遵循 Go Modules 所产生的 bug 。 而 VSCode 因为自身不提供功能,所有功能都依赖 Go 的官方工具,所以可以按照规则自动完成。 GOPATH 开发模式,代码必须放在 $GOPATH/src 下,所有装的包也都在 $GOPATH/src 下。 Go Modules 开发模式,项目中包含 go.mod 文件,所有装的包都在 $GOPATH/pkg/mod 下,按版本共享。 所以你附言 3 说的“搞了半天你们都还在用 GOPATH”是不对的,根据规则,只要 go 版本足够,项目中只要有 go.mod 就是 Go Modules 模式了。Goland 不支持提示只是因为 Goland 没有用官方工具链而产生的 bug,使用 Goland 右键菜单中的官方 goimports 工具可以正确识别 Go Modules 的依赖包。 |
55
jinliming2 2020-07-23 23:03:33 +08:00 1
顺带一提,如果使用 Go 官方工具链的话,go get 几乎都没有用过了。
新项目只要 go mod init ...,然后建个 go 文件开始写就行了,历史装过的包会自动提示、goimports 自动导入,历史没装过的包,直接复制包名放到 import 语句里就行,也不需要 go get,新包会在你 go run 或者 go build 的时候自动下载安装,并更新 go.mod 文件。 讲真,好久都没用过 go get 了…… 更新包的话,VSCode 里打开 go.mod 文件有版本提示,点击一下就自动更新了…… |
56
ysmood 2020-07-23 23:09:08 +08:00
@saltbo 老哥,vscode 这么简单,哪儿麻烦了啊,我安装到新电脑没配置任何东西,就能 debug golang 了。好奇你怎么用的?
|
57
saltbo OP 但是 Goland 在代码中右键 -> Go Tools -> Goimports File 却可以自动去 $GOPATH/pkg/mod 导入的,因为这个功能调用的是官方的 goimports 工具。但是虽然自动导入了,Goland 依旧显示为红色,不认,你还得再右键 Show Context Actions -> Sync dependencies 同步一遍。
@jinliming2 亲测可以,终于来了个明白人。 解释的很清楚了~ |
59
saltbo OP @jinliming2 不过反正已经开发完了,虽然这个问题解决了,但是对于历史没有下过的包还是有点用的 哈哈~
|
61
maoxs2 2020-07-24 00:30:36 +08:00 via Android
真就没啥用。如果是开发导入包,本地已有的现在的 vscode 和 goland 都能自己识别,而且第一次用的话还是手动写上 import 甚至自己再检查一遍 go.mod 更安全。如果是取 binary,我看很多现在都是鼓励直接下载 binary 了因为有些为了性能不是 pure go 的没法通过简单 go get 安装所以都推荐 release 里去直接下载编译好的。
|
62
laike9m 2020-07-24 02:09:42 +08:00
支持,我很早之前有过类似的想法,确实手动输入 URL 太麻烦
|
63
laike9m 2020-07-24 02:11:23 +08:00
另外建议你去 Reddit 宣传一下。这个项目最少 300 star 起。
|
64
saillin 2020-07-24 10:19:27 +08:00
一直不知道 go get 下来的包放在哪个目录{笑哭}
|
65
Kilerd 2020-07-24 10:26:17 +08:00
现阶段应该项目都快切到 go mod 了吧。 好久没见过人用 go get 了
|
66
saltbo OP |
67
saltbo OP @saillin 如果是 GOPATH 模式,那 go get 就是下载到了 GOPATH/src 下 如果是 go module 那就是下到了 GOPATH/pkg/mod
|
68
lscho 2020-07-24 11:20:57 +08:00
我差点以为 go 就这么差劲吗?竟然还得手动搜索包去得到链接
|
70
js2854 2020-07-24 13:58:12 +08:00
|
71
krixaar 2020-07-24 14:22:00 +08:00
其实就是把网页用 XPath"//h2[@class='SearchSnippet-header']/a"或者正则匹配一下输出那几个候选项,没从根本上解决什么痛点(少开一个浏览器窗口?),还多引入一个工具,感觉这类功能实现直接发个 code snippet 或者干脆不说都行,打个比方,如果我真有这个痛点,Win 下面用 Powershell 可以 Invoke-Webrequest 把网页下载下来,然后 XPath 匹配输出,没有几行代码,非 Win 的也可以 curl 再 grep/sed 一下,难度更低,写成个简单的脚本也可以直接命令行,效果也差不了十万八千里,单为了这个功能下载一个 binary 感觉有点过了。
|