从 gopath 到 go mod 的一次尝试

本贴最后更新于 2206 天前,其中的信息可能已经时移世易

windows 下的尝试:

gomod 初尝试
  1. 下载官方包 1.11(及其以上版本将会自动支持 gomod) 默认 GO111MODULE=auto(auto 是指如果在 gopath 下不启用 mod)

go mod help 查看帮助

go mod init(项目模块名称)初始化模块,会在项目根目录下生成

go.mod 文件。

go mod tidy 根据 go.mod 文件来处理依赖关系。

go mod vendor 将依赖包复制到项目下的 vendor 目录。建议一些使用了被墙包的话可以这
么处理,方便用户快速使用命令 go build -mod=vendor 编译

go list -m all 显示依赖关系。go list -m -json all 显示详细依赖关系。

go mod download <path@version> 下载依赖。参数 (path@version) 是非必写的,path 是包的路径,version 是包的版本。

  1. gopath 外新建一个项目,单独开一个 cmd 设置 set GO111MODULE=on (习惯性的和 git 初始化一样)go mod init 然后报错了。 正解如下: go mod xxx(module名称可与文件名不同)

  2. 在项目目录下执行 go mod tidy 下载完成后项目路径下会生成 go.modgo.sum

go.mod 文件必须要提交到 git 仓库,但 go.sum 文件可以不用提交到 git 仓库(git 忽略文件.gitignore 中设置一下)。

  1. go 模块版本控制的下载文件及信息会存储到 GOPATH 的 pkg/mod 文件夹里。

  2. 在国内访问 golang.org/x 的各个包都需要翻墙,我们可以在 go.mod 中使用 replace 替换成 github 上对应的库。(强烈建议翻墙,我使用的 lantern 专业版 +proxifier)非常稳定

以下是在公司项目中碰到的几点坑
  1. 在引用 mongodb 的包时候报错

go mod labix.org/v2/mgo@v0.0.0-20140701140051-000000000287: bzr branch --use-existing-dir
解决办法 谷歌论坛

在 go.mod 中

replace ( labix.org/v2/mgo => github.com/go-mgo/mgo v0.0.0-20160801194620-b6121c6199b7 launchpad.net/gocheck => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 )
  1. 引入本地包的方法(在 go.mod 中)
require ( test v0.0.0 ) replace ( test => ../test ) 注意:1.引入的包必须也是gomod的(有.mod文件) 2.replace时必须使用相对路径比如../ ./ 3.require 的包后必须带版本号,replace中可带可不带
  1. go.mod 文件必须传入 git 服务器上

linux 下的尝试

几乎都是翻墙的问题

replace ( cloud.google.com/go => github.com/googleapis/google-cloud-go v0.34.0 gopkg.in/tomb.v1 => github.com/go-tomb/tomb v1.0.0-20141024135613-dd632973f1e7 go.opencensus.io => github.com/census-instrumentation/opencensus-go v0.19.0 go.uber.org/atomic => github.com/uber-go/atomic v1.3.2 go.uber.org/multierr => github.com/uber-go/multierr v1.1.0 go.uber.org/zap => github.com/uber-go/zap v1.9.1 golang.org/x/crypto => github.com/golang/crypto v0.0.0-20181001203147-e3636079e1a4 golang.org/x/lint => github.com/golang/lint v0.0.0-20181026193005-c67002cb31c3 golang.org/x/net => github.com/golang/net v0.0.0-20180826012351-8a410e7b638d golang.org/x/oauth2 => github.com/golang/oauth2 v0.0.0-20180821212333-d2e6202438be golang.org/x/sync => github.com/golang/sync v0.0.0-20181108010431-42b317875d0f golang.org/x/sys => github.com/golang/sys v0.0.0-20181116152217-5ac8a444bdc5 golang.org/x/text => github.com/golang/text v0.3.0 golang.org/x/time => github.com/golang/time v0.0.0-20180412165947-fbb02b2291d2 golang.org/x/tools => github.com/golang/tools v0.0.0-20181219222714-6e267b5cc78e google.golang.org/api => github.com/googleapis/google-api-go-client v0.0.0-20181220000619-583d854617af google.golang.org/appengine => github.com/golang/appengine v1.3.0 google.golang.org/genproto => github.com/google/go-genproto v0.0.0-20181219182458-5a97ab628bfb google.golang.org/grpc => github.com/grpc/grpc-go v1.17.0 gopkg.in/alecthomas/kingpin.v2 => github.com/alecthomas/kingpin v2.2.6+incompatible gopkg.in/mgo.v2 => github.com/go-mgo/mgo v0.0.0-20180705113604-9856a29383ce gopkg.in/vmihailenco/msgpack.v2 => github.com/vmihailenco/msgpack v2.9.1+incompatible gopkg.in/yaml.v2 => github.com/go-yaml/yaml v0.0.0-20181115110504-51d6538a90f8 labix.org/v2/mgo => github.com/go-mgo/mgo v0.0.0-20160801194620-b6121c6199b7 launchpad.net/gocheck => github.com/go-check/check v0.0.0-20180628173108-788fd7840127 )

主要包括:golang.org google.golang.org gopkg.in go.uber.org cloud.google.com 在下载包时会有 timeout 导致编译失败,以上是对应的 github 的库

参考资料

ieevee.com
鸟窝
segmentfault

--------------------分割线---------------------------------------------------------

Go Module 工程化实践(一):基础概念篇

Go Module 工程化实践(二):go get 取包原理篇

根据以上资料总结

  1. gopath 与 go mod 的区别
环境变量GOPATH不再用于解析imports包路径,即原有的GOPATH/src/下的包,通过import是找不到了。 Go Module功能开启后,下载的包将存放与$GOPATH/pkg/mod路径 $GOPATH/bin路径的功能依旧保持
  1. go get 流程的变化
老的go get取包过程类似:git clone + go install , 开启Go Module功能后go get就只有 git clone 或者 download过程了。 新老实现还有一个不同是,两者存包的位置不同。前者,存放在$GOPATH/src目录下;后者,存放在$GOPATH/pkg/mod目录下。 老的go get取完主包后,会对其repo下的submodule进行循环拉取。新的go get不再支持submodule子模块拉取。
  1. 依赖包的变化
三方远程包: 检查远程仓库最新的tag版本,有就取得该版本 远程仓库没有tag版本时,直接获取master分支的HEAD版本 如果在go.mod文件中指定了具体版本,go get直接获取该指定版本 go.mod中除了可以指定具体版本号以外,还支持分支名 本地包: 通过replace()进行替换
  1. 私有仓库权限和私有 vcs 非标准路径取包问题
权限问题 windows10下: 控制面板>用户账户>凭据管理手动添加普通凭据即可 linux下: 增加 $HOME/.gitconfig 配置: [url "ssh://git@github.com/MYORGANIZATION/"] insteadOf = https://github.com/MYORGANIZA... 增加 $HOME/.netrc: machine github.com login YOU password APIKEY 将其中的 APIKEY 换成自己的登录KEY。 增加 $HOME/.netrc: machine github.com login YOU password APIKEY 将其中的 APIKEY 换成自己的登录KEY。 非标准路径问题(https://private.vcs.com:20000) 搭建一个中间服务:https://private.vcs.com 能够通过go get的包路径匹配查询正确的仓库地址。```
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    498 引用 • 1395 回帖 • 257 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
xhaoxiong
站在巨人的肩膀上学习与创新

推荐标签 标签

  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 546 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 442 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    132 引用 • 1115 回帖 • 121 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 544 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 739 回帖
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 544 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 86 关注
  • Access
    1 引用 • 3 回帖 • 5 关注
  • 导航

    各种网址链接、内容导航。

    43 引用 • 177 回帖
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 736 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 679 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 116 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    198 引用 • 541 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    366 引用 • 1842 回帖 • 2 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 73 关注
  • 分享

    有什么新发现就分享给大家吧!

    247 引用 • 1794 回帖
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    53 引用 • 40 回帖 • 1 关注
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 635 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 84 关注
  • Excel
    31 引用 • 28 回帖