The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
wsseo

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

  •  
  •   wsseo · Sep 4, 2019 · 14732 views
    This topic created in 2622 days ago, the information mentioned may be changed or developed.
    很多文章在介绍 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 replies  •  2019-09-05 15:07:24 +08:00
    aofei
    aofei
    Sep 4, 2019❤️3
    1
    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
    aofei
    Sep 4, 2019
    2
    我的天!!!我居然能回复别人了!!!我刚才好一阵子在 V2EX 上逛都没法儿回别人的 post ……说是得等我注册满 30 天才行😢……
    fangdingjun
    fangdingjun
    Sep 4, 2019
    3
    使用 gomodule, 你得能访问 proxy.golang.org 才行,哈哈
    Hellert
    Hellert
    Sep 4, 2019
    4
    比如你有 10 个 Projects,以前都只能放到 GOPATH 下,现在你放哪里都可以了。
    aofei
    aofei
    Sep 4, 2019
    5
    @fangdingjun 推荐使用七牛云运行的 goproxy.cn 哦~做了全球范围的 CDN 加速,速度能快到让你吃惊~😊
    lcode
    lcode
    Sep 4, 2019
    6
    官方不是推荐 dep 吗
    wsseo
    wsseo
    OP
    Sep 4, 2019
    7
    @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
    aofei
    Sep 4, 2019
    8
    @lcode dep 现在已经渐渐退出舞台了…
    aofei
    aofei
    Sep 4, 2019
    9
    @wsseo

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

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

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

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

    lz 提的问题一部分是自己的问题,一部分是生态的问题,不过毕竟 go mod 确实新出,确实需要一些时间给人适应
    reus
    reus
    Sep 4, 2019
    31
    你都没掌握它的用法,就不要评价什么了
    官方 wiki 就很好: https://github.com/golang/go/wiki/Modules
    solos
    solos
    Sep 4, 2019
    32
    go module 感觉特别好用啊 以前用 glide 有时候有点小问题
    T3RRY
    T3RRY
    Sep 5, 2019
    33
    go module 才是解决了 gopath 不好用的问题!
    很奇怪为什么还在认为 gopath 好用
    Hanggi
    Hanggi
    Sep 5, 2019
    34
    你问的这些问题都不是问题,谷歌搜一下就好了
    SpiderShrimp
    SpiderShrimp
    Sep 5, 2019
    35
    go 1.12 就该用 go module 了
    lrh3321
    lrh3321
    Sep 5, 2019
    36
    go 1.12 暂时不打算升 1.13.不过早就用上 go module 了
    lazypu
    lazypu
    Sep 5, 2019
    37
    就几个命令...
    Pythondr
    Pythondr
    Sep 5, 2019
    38
    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
    wsseo
    OP
    Sep 5, 2019
    39
    @Pythondr
    3.本地其他包也用 go mod 管理,包引用的时候还是要用 replace,不然找不到?
    如果所有包都要搞 cvs,感觉很蹩脚。
    wsseo
    wsseo
    OP
    Sep 5, 2019
    40
    3.用 replace 导入自己的包,可以编译运行,只是 vscode gplsp 各中问题,导入报错,函数没补全
    wsseo
    wsseo
    OP
    Sep 5, 2019
    41
    补上 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
    wsseo
    OP
    Sep 5, 2019
    42
    "gopls is currently in alpha, so it is not stable",不想折腾了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4052 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 73ms · UTC 07:58 · PVG 15:58 · LAX 23:58 · JFK 02:58
    ♥ Do have faith in what you're doing.