V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
saltbo
V2EX  ›  程序员

goget, 一个比 go get 更方便的装包工具

  •  
  •   saltbo ·
    saltbo · 2020-07-23 11:32:34 +08:00 · 4952 次点击
    这是一个创建于 1571 天前的主题,其中的信息可能已经有所发展或是发生改变。

    介绍

    Gopher,你是否每次装包都得打开 GitHub 去搜索,然后 Copy 包的地址,最后再 go get github.com/xxx/xxx,是不是太麻烦了。

    对于一些常用的包,我们知道他的名字,但是却记不住他的全路径,所以每次都会重复上述场景。

    现在 goget 来解决这个问题。

    对比

    传统方式:go get -u github.com/gin-gonic/gin

    便捷方式:goget gin

    项目地址

    https://github.com/saltbo/goget

    第 1 条附言  ·  2020-07-23 13:19:10 +08:00
    总有人根本就没有使用就来评价。这里我直接说一下这个工具的原理吧。

    其实很简单,就是提供了一个命令式的搜索入口,底层以来的是 pkg.go.dev ,我们执行 goget gin 的时候就会把搜索结果给你列出来让你选,选完之后,如果你不知道这个库怎么用,可以选择打开文档。如果知道了,那就直接下一步。

    最后选择是否安装包,如果是,就执行 go get `你选择的包地址`。就这么简单~
    第 2 条附言  ·  2020-07-23 13:20:38 +08:00
    觉得有用的 gopher 麻烦赏个 star,谢谢~
    第 3 条附言  ·  2020-07-23 18:32:08 +08:00
    搞了半天你们都还在用 GOPATH,我是真没想到还有这么多人在用 GOPATH,go module 都发布多久了...
    第 4 条附言  ·  2020-07-24 10:49:02 +08:00
    手动高亮结论:

    Goland 在代码中右键 -> Go Tools -> Goimports File 却可以自动去 $GOPATH/pkg/mod 导入的,因为这个功能调用的是官方的 goimports 工具。但是虽然自动导入了,Goland 依旧显示为红色,不认,你还得再右键 Show Context Actions -> Sync dependencies 同步一遍。


    因为我一直在用 goland 下的 go mod,所以之前确实不知道 goimports 可以自动导入了,但是 Goland 还不支持~

    不过现阶段,在 Goland 支持之前,goget 还是更方便的。以后 Goland 支持之后,可以仅作为 pkg.go.dev 的快捷入口来用。不需要争论了,大家歇了吧~
    banishee
        1
    banishee  
       2020-07-23 11:42:24 +08:00
    我觉得 go module 很香了,虽然要先 clone 项目
    janxin
        2
    janxin  
       2020-07-23 11:45:00 +08:00
    有两个包叫一个名字怎么解决...

    比如 gin 和 gin/v2

    比如两个包都叫 errors
    janxin
        3
    janxin  
       2020-07-23 11:46:37 +08:00
    @janxin 我搞错了,是用户可以选择的...
    Vegetable
        4
    Vegetable  
       2020-07-23 11:48:57 +08:00
    go.dev 已经在做了,cli 工具还会远吗
    also24
        5
    also24  
       2020-07-23 11:50:52 +08:00
    saltbo
        6
    saltbo  
    OP
       2020-07-23 11:54:07 +08:00
    @also24 是的 就是基于 pkg.go.dev 的搜索做的,技术上很简单,就是为了便捷操作而已~
    saltbo
        7
    saltbo  
    OP
       2020-07-23 11:55:50 +08:00
    @banishee 麻烦仔细看下再怼。 这不是新的包管理工具,只是一个方便 go get 的工具~
    Leigg
        8
    Leigg  
       2020-07-23 12:01:52 +08:00 via Android
    要做就做到足够好,参考 docker 的包管理可以参考
    Leigg
        9
    Leigg  
       2020-07-23 12:02:01 +08:00 via Android
    要做就做到足够好,docker 的包管理可以参考
    imnaive
        10
    imnaive  
       2020-07-23 12:22:33 +08:00
    如果不是 github.com/* 开头的,像 golang.org/* 还能用吗
    Leigg
        11
    Leigg  
       2020-07-23 12:36:46 +08:00 via Android
    @Leigg 应该叫镜像管理
    reus
        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
    没有击中痛点,不用。
    saltbo
        13
    saltbo  
    OP
       2020-07-23 13:10:25 +08:00
    @imnaive 可以的 这就是基于 pkg-go-dev 做的搜索,你体验下就知道了
    saltbo
        14
    saltbo  
    OP
       2020-07-23 13:15:18 +08:00
    @reus 麻烦你先搞清楚再评价,谢谢
    SingeeKing
        15
    SingeeKing  
       2020-07-23 13:22:35 +08:00
    建议增加类似于「自定义词典」的功能(最好是选择时候就询问是否自动记忆)和「自动使用最新大版本」的配置
    huobazi
        16
    huobazi  
       2020-07-23 13:27:14 +08:00
    没有 ruby gems 和 .net nuget 和 flutter pub 那样的东西吗?
    reus
        17
    reus  
       2020-07-23 13:36:01 +08:00   ❤️ 2
    @huobazi 当然有,而且是官方提供的工具。楼主就是写了个几十行的包装官方工具的小程序,就声称比官方工具更方便。作为 go 的使用者,我认为这个工具没啥用,结果楼主很不乐意。
    js2854
        18
    js2854  
       2020-07-23 13:44:50 +08:00
    @reus +1024
    gravitybox
        19
    gravitybox  
       2020-07-23 13:59:35 +08:00
    go mod
    saltbo
        20
    saltbo  
    OP
       2020-07-23 14:34:26 +08:00
    @reus 不喜欢用可以不用。 我只是希望你先搞清楚我解决的痛点是什么再来评论。
    kidlj
        21
    kidlj  
       2020-07-23 14:47:20 +08:00
    chennqqi
        22
    chennqqi  
       2020-07-23 14:48:21 +08:00
    export GOPROXY=https://goproxy.cn 不香吗
    saltbo
        23
    saltbo  
    OP
       2020-07-23 14:58:30 +08:00
    @kidlj 棒 这个工具正好是我想找的。 可以用来下载 release 的文件。 但是,这个跟我的不是一个用途啊~
    saltbo
        24
    saltbo  
    OP
       2020-07-23 14:59:16 +08:00
    @chennqqi goget 不是要替代 gomodules 。。
    lasuar
        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
    saltbo
        26
    saltbo  
    OP
       2020-07-23 15:24:55 +08:00
    @lasuar 改了个名,再试下
    chennqqi
        27
    chennqqi  
       2020-07-23 16:36:11 +08:00
    @lasuar 确实没仔细看你的用途。。但是 get 不到你这个软件的点,支持开源。真的感觉是个伪需求。。。go mod 的路径和 go get 路径不一样。。自己在写代码的时候使用哪个库显然是知道的,导入后 go mod 自己下载。另外搭个车 go-get.cn 这个域名你考虑不。。便宜点出给你
    saltbo
        28
    saltbo  
    OP
       2020-07-23 17:08:31 +08:00
    @chennqqi 请你默写 gin 的 go get 命令
    Kr98
        29
    Kr98  
       2020-07-23 17:17:21 +08:00
    @saltbo 不需要 go get 这个命令的。
    第一次使用在代码里写一下 import 地址,go module 会自动下载。
    第二次使用你在代码里写'gin',goimports 会自动帮你修改 import 列表。
    saltbo
        30
    saltbo  
    OP
       2020-07-23 17:29:35 +08:00
    @Kr98 我解决的就是在新项目里第一次 import 的问题啊
    Kr98
        31
    Kr98  
       2020-07-23 17:32:17 +08:00 via Android
    @saltbo 只要你的机器上装过一次某个库,goimports 都会自动导入,新项目也一样,所以不存在重复找地址的情况。
    Kr98
        32
    Kr98  
       2020-07-23 17:33:48 +08:00 via Android
    @saltbo 除非经常换开发机,但很少有人这样吧。
    Vegetable
        33
    Vegetable  
       2020-07-23 17:40:01 +08:00
    @saltbo #30 go mod 的流程一般是先在文件里 import,如果本地已经有了这个包(一般常用的包本地用过就会缓存下来),可以直接补全的,go mod 自己会处理后续。只有本地没有的情况下才需要手动写 import 完整地址,但是这情况还是比较少见的。换句话说,go mod 环境不需要显式 go get,你如果做一个 ide 插件聚焦在搜索上,会更好用一点,这种命令行工具,可能的确很多人不感冒。
    saltbo
        34
    saltbo  
    OP
       2020-07-23 17:47:35 +08:00
    @Kr98 我靠 是我配置有问题么 还是 Goland 不支持? 我新建项目从来都没有自动导入过啊
    saltbo
        35
    saltbo  
    OP
       2020-07-23 17:48:13 +08:00
    @Vegetable 你用的 goland 还是 vscode ?
    zhs227
        36
    zhs227  
       2020-07-23 17:53:30 +08:00
    我见过不少 GO 的库自身是带有一个工具的,而这个工具经常也是需要安装的。比如用来生成脚手架代码等,工具还是挺 好用的。只是不扶墙连不上。
    Vegetable
        37
    Vegetable  
       2020-07-23 18:00:47 +08:00
    @saltbo #35 我是 VScode+Language Server,我倒也不知道这个自动 import 是哪个工具提供的,反正能用。
    saltbo
        38
    saltbo  
    OP
       2020-07-23 18:06:20 +08:00
    @Kr98 我好像知道了 你还在用 GOPATH 吧 如果走 go mod, 你不进行 go get 就不会自动导入的
    saltbo
        39
    saltbo  
    OP
       2020-07-23 18:07:52 +08:00
    @Vegetable 我不喜欢用 vscode 写 go 但是我想了解下 既然你用 go mod 了 那么当你新建一个项目然后执行 go mod init newproject 这个时候你去 main.go 里写 gin. 会自动导入么?
    Vegetable
        40
    Vegetable  
       2020-07-23 18:11:56 +08:00
    @saltbo #39 会的,前提是我本地用过 gin 这个包,输出 gin 就会出现补全 Enter 就导入了,也可以直接访问方法。
    如果完全没用过的包,像上边有人提到的更换开发机的话,需要手动处理一次。
    poppersd
        41
    poppersd  
       2020-07-23 18:14:21 +08:00
    @saltbo goland 反正支持自动导入,vscode 不晓得
    saltbo
        42
    saltbo  
    OP
       2020-07-23 18:20:45 +08:00
    @poppersd 我觉得你们都在用 GOPATH, 否则不可能自动导入的
    renmu123
        43
    renmu123  
       2020-07-23 18:26:17 +08:00 via Android
    从别的语言过来的开发者很奇怪 go 竟然没有中心化的包管理工具,好处也是有的,那就是好的包命名不担心被别人抢了(笑
    saltbo
        44
    saltbo  
    OP
       2020-07-23 18:30:52 +08:00
    @renmu123 这个优点我觉得很好啊,像 rust 里的 crypto 就被人抢占了,但是后面又不维护了,结果就是还有个 rust-crypto 。但是对于刚接触这块儿的人来说最开始肯定是以为 crypto 更好~~
    poppersd
        45
    poppersd  
       2020-07-23 19:05:04 +08:00
    @saltbo 老哥自己试试呀。1.14 go modules
    HsiungWang
        46
    HsiungWang  
       2020-07-23 19:31:31 +08:00 via iPhone
    顶楼主,老阴阳人太多了。觉得不爽,你贴一个自己的让其他人掌掌眼,别说那种不会制冰还不能评论电冰箱,这不是一回事。
    reus
        47
    reus  
       2020-07-23 19:47:39 +08:00
    @Kr98 我一开始就和楼主讲了,结果说了半天居然还觉得有人用 GOPATH 。再说了,就算我把 gin 的导入地址打全了,下次要用,zsh 、fish,甚至 bash 都会记得,直接就能补全。实在没有用这个工具的需要,说了半天都不信,还在那自珍。
    nextvay
        48
    nextvay  
       2020-07-23 20:38:10 +08:00
    香~ 已下载
    ysmood
        49
    ysmood  
       2020-07-23 21:18:38 +08:00
    感觉所有 go 的 IDE 都支持的很好了,基本都是自动 import 了,如何说服大家不用 IDE 呢?
    saltbo
        50
    saltbo  
    OP
       2020-07-23 21:25:10 +08:00
    #37 楼这个截图我刚看到 VScode+Language Server 这个我没用过,具体不太清楚。

    关于 Goland,经过我测试。

    1. 如果你勾选了 Enable Go Modules integration,这时候就算之前在别的项目里 go get 过同一个包,那也是不会在新项目里自动导入的。
    2. 如果你关闭了 Enable Go Modules integration,这时候如果之前的项目里 go get 过,在新项目里就可以自动导入了。因为这时候你实际上还是用的 GOPATH (不论项目下有没有 go.mod )

    除以上情况,如果你们还能自动导入,可以教教我~
    saltbo
        51
    saltbo  
    OP
       2020-07-23 21:26:15 +08:00
    ysmood
        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 项目。

    当然如果你要的功能确实和社区矛盾了,那确实该自己发明轮子。但目前的信息上来看合作是更好的方式。
    saltbo
        53
    saltbo  
    OP
       2020-07-23 22:50:47 +08:00
    @ysmood 不喜欢 vscode,配置起来他麻烦了
    jinliming2
        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 的依赖包。
    jinliming2
        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 文件有版本提示,点击一下就自动更新了……
    ysmood
        56
    ysmood  
       2020-07-23 23:09:08 +08:00
    @saltbo 老哥,vscode 这么简单,哪儿麻烦了啊,我安装到新电脑没配置任何东西,就能 debug golang 了。好奇你怎么用的?
    saltbo
        57
    saltbo  
    OP
       2020-07-23 23:16:33 +08:00
    但是 Goland 在代码中右键 -> Go Tools -> Goimports File 却可以自动去 $GOPATH/pkg/mod 导入的,因为这个功能调用的是官方的 goimports 工具。但是虽然自动导入了,Goland 依旧显示为红色,不认,你还得再右键 Show Context Actions -> Sync dependencies 同步一遍。

    @jinliming2 亲测可以,终于来了个明白人。 解释的很清楚了~
    saltbo
        58
    saltbo  
    OP
       2020-07-23 23:17:30 +08:00
    @ysmood 我是很久之前用的了 可能当时官方的工具链不完善吧 回头有时间我再试试 vscode
    saltbo
        59
    saltbo  
    OP
       2020-07-23 23:23:38 +08:00
    @jinliming2 不过反正已经开发完了,虽然这个问题解决了,但是对于历史没有下过的包还是有点用的 哈哈~
    reus
        60
    reus  
       2020-07-24 00:09:33 +08:00
    @saltbo 不是“终于来了个明白人”,是你终于明白了,别人根本不需要用 go get,也就没有这个痛点,不需要这个工具。
    maoxs2
        61
    maoxs2  
       2020-07-24 00:30:36 +08:00 via Android
    真就没啥用。如果是开发导入包,本地已有的现在的 vscode 和 goland 都能自己识别,而且第一次用的话还是手动写上 import 甚至自己再检查一遍 go.mod 更安全。如果是取 binary,我看很多现在都是鼓励直接下载 binary 了因为有些为了性能不是 pure go 的没法通过简单 go get 安装所以都推荐 release 里去直接下载编译好的。
    laike9m
        62
    laike9m  
       2020-07-24 02:09:42 +08:00
    支持,我很早之前有过类似的想法,确实手动输入 URL 太麻烦
    laike9m
        63
    laike9m  
       2020-07-24 02:11:23 +08:00
    另外建议你去 Reddit 宣传一下。这个项目最少 300 star 起。
    saillin
        64
    saillin  
       2020-07-24 10:19:27 +08:00
    一直不知道 go get 下来的包放在哪个目录{笑哭}
    Kilerd
        65
    Kilerd  
       2020-07-24 10:26:17 +08:00
    现阶段应该项目都快切到 go mod 了吧。 好久没见过人用 go get 了
    saltbo
        66
    saltbo  
    OP
       2020-07-24 10:42:27 +08:00
    @reus 大兄弟 是你没说清楚好么 你看看你都说了些啥

    #12 pkg.go.dev 搜索之后,双击选中,复制粘贴,就行了

    tm 我解决的就是双击选中再复制粘贴的问题,你能怪我说你都没搞清楚?
    saltbo
        67
    saltbo  
    OP
       2020-07-24 10:43:22 +08:00
    @saillin 如果是 GOPATH 模式,那 go get 就是下载到了 GOPATH/src 下 如果是 go module 那就是下到了 GOPATH/pkg/mod
    lscho
        68
    lscho  
       2020-07-24 11:20:57 +08:00
    我差点以为 go 就这么差劲吗?竟然还得手动搜索包去得到链接
    chennqqi
        69
    chennqqi  
       2020-07-24 11:23:09 +08:00
    @saltbo 老哥你不用 IDE 的么。。敲个 gin 路径就出来了
    js2854
        70
    js2854  
       2020-07-24 13:58:12 +08:00
    @saltbo 这个还真不怪人家。感觉是认知上有偏差,我觉得 @reus 他说的没有歧义

    #14 人家搞清楚了你的项目用途,但是你根本没关心人家在说什么,只是高冷的回一句“麻烦你先搞清楚再评价,谢谢”
    krixaar
        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 感觉有点过了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2739 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:24 · PVG 15:24 · LAX 23:24 · JFK 02:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.