gomod的探索和使用

原创
2019/03/02 16:12
阅读数 1.4W

#gomod的探索和使用

##go包管理工具

目前,golang的包管理工具有很多,用的比较多的包括:govendor、godep、glide等等。但是,一直以来,golang官方都没有提供一个标准的包管理工具,知道go1.11发布后,出现了一个实验中的go module。

##准备

  • go版本为1.11

  • 设置环境变量GO111MODULE为on(on: 开启go module,off: 不开启,auto:或者不设置: 当前目录不在GOPATH/src下并且存在go.mod时启用)

    export GO111MODULE=on
    
  • 在国内,比如google.golang.org下的包下不来,但是在开启go module后这些下不来的依赖包可以通过goproxy.io下载(在go get命令中自动使用代理),也可以通过 https://github.com/goproxyio/goproxy.git 自己搭建私人代理服务器

    export GOPROXY=https://goproxy.io
    

    另一个代理是 https://athens.azurefd.net 这个是微软的代理,同样可以自行搭建 https://github.com/gomods/athens ,文档 https://docs.gomods.io/

  • 如果使用了GOLANG作为IDE,可以在File -> Settings -> Go -> Go Module(vgo)中打开“Enable Go Modules(vgo) integration”选项,就可以让IDE使用go module了

##使用(几个命令)

  1. go mod init

    initialize new module in current directory

    例子:go mod init github.com/hyperledger/fabric

    说明:

    • 在当前目录下新建go.mod文件,写入第一行内容 module github.com/hyperledger/fabric
  2. go mod download

    download modules to local cache

  3. go mod tidy

    add missing and remove unused modules

    说明:

    • 会删除没用的依赖,添加所有的直接/间接依赖,包括test文件的依赖,依赖到的项目的其他包不会被添加
    • 下载到缓存的是依赖到的整个项目,而不是依赖的某个包
  4. go mod why

    explain why packages or modules are needed

    例子:go mod why -m gopkg.in/yaml.v2

  5. go mod edit

    edit go.mod from tools or scripts

  6. go mod graph

    print module requirement graph

  7. go mod vendor

    make vendored copy of dependencies

    说明:

    • 把依赖复制到当前vendor目录,不复制test文件和被引用的项目中没被引用的包
  8. go mod verify

    add verify dependencies have expected content

##一个特别的需求

  1. 前提:配置好了go module和proxy

  2. 需求:在内网有一个gitlab之类的代码库,需要下载该代码库的依赖包

  3. 问题:

    (1)在配置了proxy的时候,所有的go get都从代理服务器下载,不再从本地使用git,也就无法从内网拉取代码

    (2)在内部gitlab中的包,有可能在项目中使用“github.com/***”或者其他路径引用,go get的时候就会从引用路径找到如“github.com”的地址去使用git拉取代码,导致拉取失败

  4. 分析:

    (1)针对问题一,可以通过在内网搭设可访问google.golang.org等网址的代理服务器,如果无法访问,也可以通过再走一层代理,即如果不是内网请求就代理到 https://goproxy.io、https://github.com/gomods/athens 或者自己用国外vps搭建的

    (2)针对问题二,可以使用代理,相当于在(1)的方案上自定义代理规则;也可以通过git config配置指定url替换,如 git config --global url."git@.com:".insteadOf "https://github.com/***"

  5. 方案:

    (1)通过在内网搭设代理服务器,自定义代理规则,可以优雅地解决这两个问题,但是需要搭建服务器,一来过程麻烦,二来不一定条件允许(比如公司内网)

    (2)在需要非内网的包时,直接通过go的proxy,需要内网时,关闭go proxy,通过git的配置来指向正确的连接

    (3)一个比较偏门的方法是修改go源码,改变go get的逻辑,让它通过代码逻辑可以分别使用git和proxy拉取代码,这个没有找到案例也没有尝试过,只是要给猜想假设

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部