V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
GTim
V2EX  ›  Go 编程语言

作为 Go 使用者,你如何评价 go module ?

  •  
  •   GTim · 2018-09-26 15:59:21 +08:00 · 10393 次点击
    这是一个创建于 2248 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这个问题是在百度后台看到的问题,觉得挺有意思的。

    因为好几次看到有人使用这个关键字搜索,索性,我就代他询问下大家。


    我自己虽然也写了几篇介绍文章,但对 go module 真的是无感,既没那么兴奋,也没那么失望。

    相比于其它语言,go 的模块化 /( 包 )版本化之路走的太艰辛了

    我现在最期待的是 go module 带来的 proxy 功能,期待在这个 proxy 之上构建的中央仓库。

    56 条回复    2019-03-25 11:25:55 +08:00
    jlkm2010
        1
    jlkm2010  
       2018-09-26 16:07:40 +08:00
    希望越来越好吧
    SuperMild
        2
    SuperMild  
       2018-09-26 16:12:31 +08:00 via iPhone
    不管激动不激动,在即将发布 Go2 之前,官方都必须出一个版本管理办法,不然到时要大乱套了。go module 也许不出彩,但基本够用了,也足够简单,这就够了。
    janxin
        3
    janxin  
       2018-09-26 16:50:17 +08:00
    danc
        4
    danc  
       2018-09-26 17:05:33 +08:00
    依然是个废的
    zhenjiachen
        5
    zhenjiachen  
       2018-09-26 17:11:36 +08:00
    我觉得比野生的包管理好点了,我把之前自己用 glide 管理的项目签到 go mod 了,居然直接支持迁移,执行 go mod init 直接获取了 glide.lock 里面的包了,很方便。
    neoblackcap
        6
    neoblackcap  
       2018-09-26 17:12:58 +08:00   ❤️ 3
    我只想说,包管理是很难么?为什么现代化的语言都用中心话管理,golang 就整天扯这些。
    承认吧,golang 在依赖管理这方面就是个残废,就是想着自己内部有一个超级大的代码库,什么都可以从里面 checkout。
    压根就没有考虑其他人的使用。1991 年发明的 Python 跟 Java 都有很成熟的包管理方案,大家都习惯这样的做法。golang 到今天还要整天发文说这个版本号管理,那个机制管理。简直是败笔,无病呻吟,自找麻烦,抄都不会抄!
    polythene
        7
    polythene  
       2018-09-26 17:33:53 +08:00   ❤️ 1
    难道就只有我好奇,楼主是怎么"在百度后台" "看到有人使用这个关键字搜索"的吗?
    pabupa
        8
    pabupa  
       2018-09-26 17:39:28 +08:00
    一开始看,感觉 golang 的官方库就是要解决所有的问题,,,,不需要第三方支持……
    zhujinliang
        9
    zhujinliang  
       2018-09-26 17:41:33 +08:00
    不感兴趣,继续用最原始的 go get
    SuperMild
        10
    SuperMild  
       2018-09-26 17:57:20 +08:00
    @neoblackcap 不管包管理还是泛型,要增加一个功能或特性对于 Rob Pike 那些大牛来说毫无难度可言,你今晚下单他明天一早就能送货到家。
    qgymje
        11
    qgymje  
       2018-09-26 17:57:46 +08:00   ❤️ 1
    1. go module 所解决的是取消强制 gopath 的约束,以及 go get 的需要手动操作才能下载依赖的操作
    2. 之前使用 vendor 管理工具的,几乎可以无缝切换到 go module ;并且不需要针对包管理选择而去做技术选型了
    3. 官方与开源组织会一直提高 go module 的可用性,随着版本的更新,go module 会越来越可靠
    neoblackcap
        12
    neoblackcap  
       2018-09-26 19:22:38 +08:00 via iPhone   ❤️ 2
    @SuperMild 但是他为什么不做?原因就是 Google 不需要,你们社区要不要,他不管。
    Rob 不是圣人,要排资论辈 cpp,Java 哪个不是大牛设计?
    错误就是错误,跟谁做的没关系。

    历史就是明证,说泛型无用,check error 最好的,官方都在打脸。
    taowen
        13
    taowen  
       2018-09-26 20:38:03 +08:00
    @neoblackcap 就事论事,说说 module 有哪些相比中心化管理的缺点。
    glues
        14
    glues  
       2018-09-26 21:02:58 +08:00 via iPhone
    @SuperMild 牛逼吹的有点过了,go 开发了这么多年也就这个水平
    jlkm2010
        15
    jlkm2010  
       2018-09-26 21:45:53 +08:00
    @glues 来来来,老哥出来走两步,“也就这个水平” 到底是什么水平啊,来说说看
    reus
        16
    reus  
       2018-09-26 23:30:59 +08:00
    @neoblackcap 啥都不了解,就开喷?
    neoblackcap
        17
    neoblackcap  
       2018-09-26 23:53:39 +08:00   ❤️ 3
    @taowen
    @reus
    不对就要喷,分散代码,靠 github 管理有什么好?
    集中的一个源,我可以说有以下几个优点
    1. 快速部署镜像
    2. 不会因为 github 的地址变更而改变依赖关系。你们自己想想到底有没有 github repo 转让过用户,转让了是不是不用动代码,一个新的项目参与者能用什么方式同步依赖?

    为什么 Rob 就一定要采取这样的方式来管理依赖,你们说这个没有受到 Google 内部的基础设施影响,你们自己信吗?
    自从 Golang 发布依赖出现了多少依赖管理工具,为什么官方就不钦定一个?原因就是 Google 内部没有这个必要。bazel 加上单一的版本库,完全就可以解决版本控制,构建的问题。但是一般公司不是这样,这样才是为什么 2018 年了,golang 的版本控制还是如此让人蛋疼。

    同时你们觉得时不时插入的 check error 没有影响思路的,我觉得也是可以,毕竟这个风格问题。问题也不大,正如没有泛型也可以自己写一个代码生成器生成代码,或者编辑器编写代码片段。但是你们倒是说说用 github 作为代码仓库有什么好处?
    lxml
        18
    lxml  
       2018-09-27 03:41:53 +08:00
    确实想不通,随便 找个 python 的 pip install pip freeze 挺好的,21 世纪的 C 语言了,随便抄 npm pip 都比 go get 拉 master 分支这种一看就巨傻逼的行为好很多很多,因为包管理人家拉的都是 release ……
    izgnod
        19
    izgnod  
       2018-09-27 08:14:19 +08:00 via Android
    希望 go 越来越好吧,包管理确实蛋疼
    per
        20
    per  
       2018-09-27 08:17:24 +08:00 via iPhone
    Rob 自己都说过,在一开始做包管理的时候收到了 Google 内部一个大 repo 的影响,不过现在也在变得越来越好了
    reus
        21
    reus  
       2018-09-27 08:38:03 +08:00
    @neoblackcap “自从 Golang 发布依赖出现了多少依赖管理工具,为什么官方就不钦定一个?”
    我怎么感觉你连标题里的“ go module ”是什么都不知道啊? 1.10 引入了 go module,那 go 命令本身就是一个依赖管理工具了,你不知道吗?
    @lxml 你也是个知识没更新就瞎喷的货。
    ZSeptember
        22
    ZSeptember  
       2018-09-27 09:02:28 +08:00 via Android
    作为依赖管理差不多了,不过 go 没有中心化的仓库,是个隐患。看 github 有个代理项目,不知道会不会发展成中心仓库。
    neoblackcap
        23
    neoblackcap  
       2018-09-27 09:15:23 +08:00 via iPhone
    @reus 你说得对啊,现在都 1.11 了,也就上个版本。但是除了这个工具,官方还做了什么?语义化版本号对吧。降低 GOPATH 的影响是吧?

    你说这些是重点吗?我上面说了那么多是说这个工具吗?我是喷官方长期不作为,而且没有建立一个中心化的仓库。
    你倒是说说这个优势是什么,这个才是让人觉得巨难受的地方
    wangxiaodong
        24
    wangxiaodong  
       2018-09-27 09:21:52 +08:00
    @neoblackcap 官方不做,你可以去邮件提议,最终决策权在他们,多跟踪跟踪他们的社区讨论。

    另外,中心化的仓库也不是必须的,因为互联网的根域服务器也都在变化,听说分配给北京的几台就因为某些因素撤销了。他们说是北京问题,北京觉得是他们不遵守北京意志。

    去中心化没什么不好,docker 的 hub 似乎也变过多少回网址了!
    reus
        25
    reus  
       2018-09-27 09:29:36 +08:00
    @neoblackcap 我说错了,go module 是 1.11 引入的,可见你根本没有了解,根本就不是使用者。中心化或者非中心化,我认为没什么影响,不知道你这个并非 go 使用者的人,究竟出于何种原因觉得“难受”?你又不用,你难受什么?
    scnace
        26
    scnace  
       2018-09-27 09:32:00 +08:00 via Android
    @neoblackcap 官方不作为?你去看看 go 的 GitHub repo 下的 Issues 的回复速度?包括现在 go mod 的解决方案不也是 rsc 搞出来的吗?我觉得 Go Team 做的某些决定长期来看不一定是最好的 但是在当时的环境下看来 也是一个听了社区建议后一个不算差的选择。。包括 Go2 要出的 error handling 和 泛型。。这不算是打脸吧,因为社区是真的需要啊。。
    BarZu
        27
    BarZu  
       2018-09-27 09:44:58 +08:00
    @polythene 大概是用了百度统计,然后别人在百度搜索的结果里点进了你的网站,这样就可以看到流量来源了。
    GTim
        28
    GTim  
    OP
       2018-09-27 10:24:38 +08:00
    @BarZu
    @polythene

    是百度统计系统后台看到的,搜索的原词是 "如何评价 go module"
    neoblackcap
        29
    neoblackcap  
       2018-09-27 10:28:36 +08:00
    @reus
    我觉得你应该先讨论问题,不要是不是就扣一个非用户的帽子。退一万步哪怕我是一个不经常用的人,我也可以发表观点。相反你一个经常使用的人面对这样一个设计,你一句话没什么影响,大概 Rob 也是这样想的。

    @scnace 现在是 2018 年,error handling 跟泛型现在才说要做要改,如果你认为这是积极我也没办法,反正我对比了同期的语言,我认为这就是在这个特性上面不积极。

    @wangxiaodong 关键现在 golang 的 package 管理也不见得多去中心化,大部分依赖 github。但是这个方式无法让企业内部快速建立一个代码仓库镜像。
    tairan2006
        30
    tairan2006  
       2018-09-27 10:30:02 +08:00
    希望越来越好吧,golang 在 1.0 之前不接受别人建议,现在步履维艰,也算是咎由自取
    circleee
        31
    circleee  
       2018-09-27 10:50:32 +08:00
    kenkao
        32
    kenkao  
       2018-09-27 11:05:50 +08:00
    能说是因为 go get 和 github 的亲密关系才喜欢 golang 的吗?╮( ̄▽ ̄")╭
    实现功能--->需要轮子--->发现好的库--->go get--->github、开源、交流、学习--->自我提升--->实现功能
    myyou
        33
    myyou  
       2018-09-27 11:12:01 +08:00   ❤️ 1
    代理现在已经有了,叫 Athens: https://docs.gomods.io/ ,而且今年 GopherCon 大会上微软还宣布要为 Athens 贡献代码以及与 GopherSource 合作。
    GTim
        34
    GTim  
    OP
       2018-09-27 11:24:06 +08:00
    @myyou
    @janxin

    现在有点穷,我在想要不要捐点银子出一个墙内版的中央仓库节点
    wangxiaodong
        35
    wangxiaodong  
       2018-09-27 11:40:00 +08:00
    @neoblackcap

    “大部分依赖”是用户行为,并不是 golang 所强制的,golang 也是允许自定义托管包或自定义模块仓库的:

    go get -u golang.org/x/oauth2
    go get -u gopkg.in/yaml.v2
    go get -u k8s.io/api/...

    import yaml "gopkg.in/yaml.v2"


    so,不要因为 github 一家独大就认定是 golang 一个求稳的语言的错误!
    wangxiaodong
        36
    wangxiaodong  
       2018-09-27 11:44:36 +08:00
    @GTim 伪需求,因为安全性要求高的都自建仓库了,不高的,github 已经够用了,再加上微软的 Athens,国内理论上并不怎么需要,go 的受众也并不多。
    dodo2012
        37
    dodo2012  
       2018-09-27 11:45:44 +08:00
    不要和用 go 的争,因为从 go 出现起,只要一说 go 哪不好就要被喷
    xcstream
        38
    xcstream  
       2018-09-27 12:26:38 +08:00
    go 是谷歌自己用的,不需要你们提意见
    wspsxing
        39
    wspsxing  
       2018-09-27 12:34:43 +08:00 via Android
    作为 go 的曾经使用者,
    表示,rust+cargo 不要太爽
    AngelCriss
        40
    AngelCriss  
       2018-09-27 12:59:31 +08:00 via Android
    @wspsxing 作为 rust 的曾经使用者,表示,cpp 不要太爽 😏
    wspsxing
        41
    wspsxing  
       2018-09-27 13:09:39 +08:00 via Android
    @AngelCriss cmake 可以的😀,很强大
    gowk
        42
    gowk  
       2018-09-27 15:39:50 +08:00
    用 Java,Rust,C 艹 用的爽你们尽管去用嘛,感谢 Go 设计成现在的样子,把你们这些人拒之门外
    GTim
        43
    GTim  
    OP
       2018-09-27 16:04:27 +08:00
    @gowk 消消气
    kefengong
        44
    kefengong  
       2018-09-27 18:14:46 +08:00
    @kenkao 其实 go get 拉 github 源码库这种操作,npm 也支持,不过恶心的是 go get 好像不支持指定 tag 和 分支
    askfilm
        45
    askfilm  
       2018-09-27 18:33:16 +08:00
    我能说我一直觉得 go 就是大厂的玩具吗?
    AmorZhang
        46
    AmorZhang  
       2018-09-27 20:32:01 +08:00
    @neoblackcap 吵什么 go 语言是开源的 不满意就去改啊 官方不合并就自己 fork 啊
    jitongxi
        47
    jitongxi  
       2018-09-27 22:21:12 +08:00
    @gowk 与你同感, 同欢喜....
    kidlj
        48
    kidlj  
       2018-09-27 23:03:42 +08:00 via iPhone
    搁这里讨论 go module 的,有几个是看过 rsc 那几篇阐述博客的,举手我看看?
    ensonmj
        49
    ensonmj  
       2018-09-28 11:02:16 +08:00
    @neoblackcap python 的依赖管理也说不上多好吧,或许是我不太熟,求问对于一个 python app,怎么方便的把所有依赖都下下来?
    GTim
        50
    GTim  
    OP
       2018-09-28 13:37:08 +08:00
    @ensonmj [Python Pip 参考手册 - pip download 命令]( https://www.twle.cn/t/84#reply0)
    ensonmj
        51
    ensonmj  
       2018-09-28 17:29:50 +08:00
    @GTim 看了下链接,这个命令需要指定包或者 request 文件。这个 go get 自动分析代码里面使用的包,再下载好像不是一回事?
    GTim
        52
    GTim  
    OP
       2018-09-28 18:02:56 +08:00
    @ensonmj 一样的,比如下载 flask

    ```python
    ➜ my-app git:(master) ✗ ls

    ➜ my-app git:(master) ✗ pip download flask
    Collecting flask
    Using cached https://files.pythonhosted.org/packages/7f/e7/08578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4b/Flask-1.0.2-py2.py3-none-any.whl
    Saved ./Flask-1.0.2-py2.py3-none-any.whl
    Collecting Jinja2>=2.10 (from flask)
    Using cached https://files.pythonhosted.org/packages/7f/ff/ae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731/Jinja2-2.10-py2.py3-none-any.whl
    Saved ./Jinja2-2.10-py2.py3-none-any.whl
    Collecting itsdangerous>=0.24 (from flask)
    Using cached https://files.pythonhosted.org/packages/dc/b4/a60bcdba945c00f6d608d8975131ab3f25b22f2bcfe1dab221165194b2d4/itsdangerous-0.24.tar.gz
    Saved ./itsdangerous-0.24.tar.gz
    Collecting Werkzeug>=0.14 (from flask)
    Using cached https://files.pythonhosted.org/packages/20/c4/12e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243/Werkzeug-0.14.1-py2.py3-none-any.whl
    Saved ./Werkzeug-0.14.1-py2.py3-none-any.whl
    Collecting click>=5.1 (from flask)
    Using cached https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl
    Saved ./Click-7.0-py2.py3-none-any.whl
    Collecting MarkupSafe>=0.23 (from Jinja2>=2.10->flask)
    Using cached https://files.pythonhosted.org/packages/4d/de/32d741db316d8fdb7680822dd37001ef7a448255de9699ab4bfcbdf4172b/MarkupSafe-1.0.tar.gz
    Saved ./MarkupSafe-1.0.tar.gz
    Successfully downloaded flask Jinja2 itsdangerous Werkzeug click MarkupSafe

    ➜ my-app git:(master) ✗ ls
    Click-7.0-py2.py3-none-any.whl MarkupSafe-1.0.tar.gz
    Flask-1.0.2-py2.py3-none-any.whl Werkzeug-0.14.1-py2.py3-none-any.whl
    Jinja2-2.10-py2.py3-none-any.whl itsdangerous-0.24.tar.gz

    ➜ my-app git:(master) ✗
    ```
    newdas
        53
    newdas  
       2018-12-13 16:57:39 +08:00
    @neoblackcap 人家发明的语言,免费给你用,你还这么不满意
    lideshun123
        54
    lideshun123  
       2019-01-08 11:43:44 +08:00
    太难用了 只要用到 golang/x 的都需要翻墙
    sunday9th
        55
    sunday9th  
       2019-01-11 11:48:00 +08:00
    @lideshun123 +1, 本来 github 上的镜像 clone 下来能用,用了 module 直接凉了。真的是一顿操作猛如虎,一看战绩零杠五。
    whit
        56
    whit  
       2019-03-25 11:25:55 +08:00
    @sunday9th go.mod 中可以自己 replace 的,我是觉得很方便,以前还得自己 clone 后替换,现在直接一行代码搞定了。
    ```
    replace (
    golang.org/x/net v0.0.0-20181220203305-927f97764cc3 => github.com/golang/net v0.0.0-20181220203305-927f97764cc3
    golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 => github.com/golang/sync v0.0.0-20181221193216-37e7f081c4d4
    golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb => github.com/golang/sys v0.0.0-20181228144115-9a3f9b0469bb
    jhy/core => ../core
    )

    ```
    最后一个是我本地上层目录中自己写的一个包
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1008 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 20:07 · PVG 04:07 · LAX 12:07 · JFK 15:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.