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

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

  •  
  •   wsseo · 2019-09-04 16:30:04 +08:00 · 13309 次点击
    这是一个创建于 1667 天前的主题,其中的信息可能已经有所发展或是发生改变。
    很多文章在介绍 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 教程
    42 条回复    2019-09-05 15:07:24 +08:00
    aofei
        1
    aofei  
       2019-09-04 16:35:00 +08:00   ❤️ 3
    1. 可以;
    2. 使用了 Go modules 后所有的 import path 都得以 module path 开头,当前工作目录的话就以步骤 1 中的 module path 开头;
    3. 如果你指的“其他目录”是别的模块的,同理步骤 2,如果指的是普通文件夹,那得用 `go mod replace` 替换为你的目标路径模块;
    4. 现在大多数 IDE 的代码不全等 tools 都已经适配了 Go modules,所以基本可用;
    5. 虽然我没用过 VSCode 的,但如果它有现成的 Go 插件的话那么可以直接使用,插件会自动处理,你只需将 `GO111MODULE=on` 即可。
    aofei
        2
    aofei  
       2019-09-04 16:36:01 +08:00
    我的天!!!我居然能回复别人了!!!我刚才好一阵子在 V2EX 上逛都没法儿回别人的 post ……说是得等我注册满 30 天才行😢……
    fangdingjun
        3
    fangdingjun  
       2019-09-04 16:45:25 +08:00
    使用 gomodule, 你得能访问 proxy.golang.org 才行,哈哈
    Hellert
        4
    Hellert  
       2019-09-04 16:48:19 +08:00
    比如你有 10 个 Projects,以前都只能放到 GOPATH 下,现在你放哪里都可以了。
    aofei
        5
    aofei  
       2019-09-04 16:49:09 +08:00
    @fangdingjun 推荐使用七牛云运行的 goproxy.cn 哦~做了全球范围的 CDN 加速,速度能快到让你吃惊~😊
    lcode
        6
    lcode  
       2019-09-04 16:51:03 +08:00
    官方不是推荐 dep 吗
    wsseo
        7
    wsseo  
    OP
       2019-09-04 16:52:28 +08:00
    @aofei
    1.执行 go mod init 提示我一定要带 module
    "go: cannot determine module path for source directory /home/xxx/xxxx/xxxx/godemo (outside GOPATH, module path must be specified)"
    2,3 大致理解了
    4,5 go1.13 中 GO111MODULE 默认是 auto,vscode 代码没有补全提示
    aofei
        8
    aofei  
       2019-09-04 16:54:42 +08:00
    @lcode dep 现在已经渐渐退出舞台了…
    aofei
        9
    aofei  
       2019-09-04 16:57:02 +08:00
    @wsseo

    如果你是在你的项目根目录,且根目录包含了 .git 等 VCS 目录或者 Gopkg.lock 等旧版依赖管理文件,那么此时你 go mod init 时是不需要指定 module path,它会自己生成一个,不满意的话你到时候还可以再改。
    aofei
        10
    aofei  
       2019-09-04 16:58:23 +08:00
    @wsseo

    vscode 自动补全的话…抱歉这个我确实不太了解,因为我没用过,我能告诉你的就只有现在大多数 tools 是已经支持 modules 了的,但你的 vscode 插件用到了哪些 tools 我就不清楚了😅
    wsseo
        12
    wsseo  
    OP
       2019-09-04 17:07:04 +08:00
    @aofei 1.是没有设置 VCS。不太理解 VCS 跟 go module 有什么关系,官方教程也是先创建了一个 git 仓库.
    keyv
        13
    keyv  
       2019-09-04 17:11:02 +08:00 via iPhone
    @wsseo vscode 的补全需要装 gopls,你在设置里面把使用语言服务器这个选项打开。
    iPhoneXI
        14
    iPhoneXI  
       2019-09-04 17:13:26 +08:00 via Android
    习惯了 Python pip,node npm 当然是 go mod 好用
    iPhoneXI
        15
    iPhoneXI  
       2019-09-04 17:14:06 +08:00 via Android
    @iPhoneXI pip + virtualenv
    emeab
        16
    emeab  
       2019-09-04 17:24:04 +08:00
    @aofei 貌似有些分类是需要 30 天 有些不需要
    wsseo
        17
    wsseo  
    OP
       2019-09-04 17:50:20 +08:00
    @keyv 可以了。请问怎么去掉导入包的下划线,鼠标放在上面会提示“ follow link(ctrl+click)”
    StarUDream
        18
    StarUDream  
       2019-09-04 17:53:01 +08:00
    go mod 变得越来越好了,现在挺好用的。
    aofei
        19
    aofei  
       2019-09-04 17:53:15 +08:00
    @wsseo

    Go modules 和 VCS 并没有直接关系,就算不用 VCS 也是可以直接 Modules 的,但这种场景下你 go mod init 时就必须指定一个 module path 了,因为如果你不指定的话 go 没有参考依据,不知道怎么来。
    Stevenv
        20
    Stevenv  
       2019-09-04 18:08:43 +08:00
    module go-project

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

    lz 提的问题一部分是自己的问题,一部分是生态的问题,不过毕竟 go mod 确实新出,确实需要一些时间给人适应
    reus
        31
    reus  
       2019-09-04 21:07:28 +08:00
    你都没掌握它的用法,就不要评价什么了
    官方 wiki 就很好: https://github.com/golang/go/wiki/Modules
    solos
        32
    solos  
       2019-09-04 22:55:08 +08:00
    go module 感觉特别好用啊 以前用 glide 有时候有点小问题
    T3RRY
        33
    T3RRY  
       2019-09-05 08:11:28 +08:00
    go module 才是解决了 gopath 不好用的问题!
    很奇怪为什么还在认为 gopath 好用
    Hanggi
        34
    Hanggi  
       2019-09-05 08:15:43 +08:00
    你问的这些问题都不是问题,谷歌搜一下就好了
    SpiderShrimp
        35
    SpiderShrimp  
       2019-09-05 08:55:04 +08:00
    go 1.12 就该用 go module 了
    lrh3321
        36
    lrh3321  
       2019-09-05 09:41:02 +08:00
    go 1.12 暂时不打算升 1.13.不过早就用上 go module 了
    linxl
        37
    linxl  
       2019-09-05 10:00:00 +08:00
    就几个命令...
    Pythondr
        38
    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
        39
    wsseo  
    OP
       2019-09-05 11:23:59 +08:00
    @Pythondr
    3.本地其他包也用 go mod 管理,包引用的时候还是要用 replace,不然找不到?
    如果所有包都要搞 cvs,感觉很蹩脚。
    wsseo
        40
    wsseo  
    OP
       2019-09-05 15:04:19 +08:00
    3.用 replace 导入自己的包,可以编译运行,只是 vscode gplsp 各中问题,导入报错,函数没补全
    wsseo
        41
    wsseo  
    OP
       2019-09-05 15:05:41 +08:00
    补上 go.mod
    module hehe

    go 1.13

    require (
    github.com/gin-gonic/gin v1.4.0
    gopkg.in/ini.v1 v1.46.0
    heiheihei v0.0.0-00010101000000-000000000000
    papapa v0.0.0-00010101000000-000000000000
    )

    replace papapa => /home/sma/workspace/gowork/papapa

    replace heiheihei => /home/sma/workspace/gowork/heiheihei
    wsseo
        42
    wsseo  
    OP
       2019-09-05 15:07:24 +08:00
    "gopls is currently in alpha, so it is not stable",不想折腾了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3205 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 11:58 · PVG 19:58 · LAX 04:58 · JFK 07:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.