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

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

  •  
  •   wsseo · 68 天前 · 5535 次点击
    这是一个创建于 68 天前的主题,其中的信息可能已经有所发展或是发生改变。
    很多文章在介绍 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
        1
    aofei   68 天前   ♥ 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` 即可。
        2
    aofei   68 天前
    我的天!!!我居然能回复别人了!!!我刚才好一阵子在 V2EX 上逛都没法儿回别人的 post ……说是得等我注册满 30 天才行😢……
        3
    fangdingjun   68 天前
    使用 gomodule, 你得能访问 proxy.golang.org 才行,哈哈
        4
    Hellert   68 天前
    比如你有 10 个 Projects,以前都只能放到 GOPATH 下,现在你放哪里都可以了。
        5
    aofei   68 天前
    @fangdingjun 推荐使用七牛云运行的 goproxy.cn 哦~做了全球范围的 CDN 加速,速度能快到让你吃惊~😊
        6
    lcode   68 天前
    官方不是推荐 dep 吗
        7
    wsseo   68 天前
    @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 代码没有补全提示
        8
    aofei   68 天前
    @lcode dep 现在已经渐渐退出舞台了…
        9
    aofei   68 天前
    @wsseo

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

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

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

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

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