Go SDK 1.13测试版已经发布了。从此版本开始,Go modules依赖库版本管理特性将正式开始推荐使用。本文将解释一些和Go modules相关的一些命令和概念。

Module(模块)定义为一些Go代码包的集合。通常体现为一个含有若干代码包的目录。每个模块可以发布一系列版本。版本号使用semver(语义化版本 https://semver.org/lang/zh-CN/ )表示。一个模块可能依赖于其它若干模块;准确说来,是依赖于其它若干模块的各自的某个具体版本。每个模块可以在自己的根目录下的go.mod文件中指定其所依赖的各个模块的具体版本。

如果你所维护的某个模块尚未使用Go modules管理依赖,你可以打开一个命令行终端,进入此模块根目录,运行下面这条命令将此模块转换为一个使用Go modules管理依赖的模块。

go mod init host.prefex/mypkg

其中,host.prefex/mypkg为其它包引入此模块中的包时的引入路径的前缀。常常地,host.prefexgithub.com等源代码托管网站;mypkg常为 user/project 这种形式。当然,你也可以将你自己的域名 my.website 用做引入路径的前缀(host.prefex)。但是这时如果不能从引入路径my.website/mypkg 中判断出此代码包使用何种源代码版本管理工具(比如git/hg/svn等),则my.website网站必须响应 https://my.website/mypkg?go-get=1 HTTPS请求(HTTP也可以但不推荐),并在在HTML的返回体中的<head>部分包含一个<meta>标签来指名具体到哪里下载此模块。(本博将另开一篇文章详解自定义域名引入路径。)

go.mod文件已经创建出来之后,我们可以在此文件中手动指定此模块所要依赖的其它模块和这些以来模块的版本号(版本号必须制定但可以使用伪版本号,比如 <v1.12.3>=v1.5.6latest和分支名master等)。我们也可以运行go buildgo test等命令来自动发现并且在go.mod文件中加入依赖模块和它们的具体版本。手动指定的伪模块版本号将被go build等命令更改为确切的版本号。其中

  • latest伪版本号将被解读为最新正式发布版本,正式发布版本是标号为形如vX.Y.Z的语义化版本(semver,`X`/`Y`/`Z`均为整数数字)。
  • 分支名伪版本号将被解读为指定分支的最新提交。
  • <v1.12.3 将被解读为v1.12系列版中最大的小于v1.12.3的版本。

当使用源代码版本管理工具时,一个tag的名称将被视为一个版本号。形如 v1.2.3-pre1 的预发布版本不属于正式版本。(关于模块的版本匹配规则,本博将另发一篇文章详述。)

go build等命令将下载并缓存尚未缓存的依赖模块的版本代码。

在一个模块目录下运行 go get a.b.c/x/y@v1.2.3 将在此模块的go.mod文件中加入一个依赖。

默认情况下,go build等命令将访问sumdb(Checksum Database,默认值为 https://sum.golang.org/ )验证下载的各个直接或者间接依赖模块的哈希值是否和sumdb中记录的哈希值相匹配。如果不匹配,很可能某些环节出了问题(比如下载的模块代码被人恶意更改了)。

一般说来,go.mod文件中只记录当前模块的直接依赖。每个依赖体现为一条require或者replace指令。比如

module my.website/cmd/myprogramrequire github.com/boltdb/bolt v1.3.0replace my.website/mypkg github.com/myname/myproject v1.0.0

其中的 replace 指令表示,当遇到引入路径前缀为 my.website/mypkg 的代码包时,真实的下载的代码包为处于路径 github.com/myname/myproject 的v1.0.0版本的模块下的相应代码包。

如果你的一个旧项目是使用其它流行第三方工具(比如deps和glide等)来管理包依赖的,则在此项目下运行 go mod init host.prefex/mypkg 命令将自动将此项目转换为一个使用 go modules 管理依赖的项目。

如果你的一个新项目需要依赖于一个当前正使用其它流行第三方工具来管理包依赖的库,则请到此库的根目录下运行以下 go mod init a.b/c命令(引入路径可任意),然后将生成的go.mod中的所有require指令复制到你的新项目下的go.mod文件中。(至少对于目前的Go SDK 1.12是如此,以后的Go SDK版本可能会对此过程进行改进。)

一些其它的和modules相关的常用命令和命令选项:

*go list -m all 列出所有的(包括直接的和间接的)将在go build中使用的各个模块和它们的具体版本号。

  • go list -u -m all 列出所有的(包括直接和间接)使用的各个模块目前可用的小更新或者补丁版本号。undefined
  • go get -u or go get -u=patch 将目前所有的(直接和间接)依赖的模块的版本号更新到最新可用的小更新或者补丁版本号。
  • go mod tidy 从go.mod中删除目前已经不再使用的依赖模块,加入其它操作系统和架构所需的依赖。在以后的SDK版本中,此命令可能会在执行其它go命令时自动执行。
  • go mod vendor 将所有依赖放入当前模块下的vendor子目录中。
  • go build -mod vendor使用当前模块下的vendor子目录中的依赖代码(而不是缓存中依赖模块代码)来编译构建。

更多关于Go语言的细节、技巧和常识,请访问《Go语言101》项目或者《Go语言101》官网,或者关注本专栏公众号(Go 101):

此项目与visual studio的当前版本不兼容_忘掉GOPATH,迎接Go modules,进入Go项目依赖库版本管理新时代...相关推荐

  1. 此项目与visual studio的当前版本不兼容_新MacBook能用旧软件?可能是最详细的兼容测试...

    来源:太平洋电脑网 M1版新MacBook的兼容性到底怎么样?苹果使用M1芯片的MacBook已经逐渐开始发货了,我们知道M1芯片基于ARM架构,和之前基于X86架构的Intel芯片有很大差异,因此新 ...

  2. 此项目与Visual Studio的当前版本不兼容的报错

    转自:https://blog.csdn.net/CCmonitor/article/details/75817734 问题: 程序是用visual studio 2013开发的,放在本地运行报此项目 ...

  3. 将cocos2dx项目从Visual Studio 迁移到 xcode

    因为Visual Studio和XCode的巨大差异性,一开始选择任何一个IDE,都会有一个迁移的过程,XCode的迁移到Visual Studio相对非常简单,不用再介绍.将项目从Visual St ...

  4. 解决 Visual Studio 2017 RC 不兼容低版本 Visual Studio 创建的 MVC 4 项目的问题

    解决 Visual Studio 2017 RC 不兼容低版本 Visual Studio 创建的 MVC 4 项目的问题 参考文章: (1)解决 Visual Studio 2017 RC 不兼容低 ...

  5. 将 Web 项目从 Visual Studio .Net 2002/2003 转换到 Visual Studio 2005 的分步指南

    本页内容 转换注意事项 第一部分:准备要转换的 Visual Studio .Net 2002/2003 Web 项目 第二部分:迁移您的 Web 项目 第三部分:完成迁移的迁移后步骤 第四部分:其他 ...

  6. visual报表服务器项目,为 Visual Studio ALM 创建报表服务器项目

    为 Visual Studio ALM 创建报表服务器项目 06/09/2015 本文内容 通过使用 SQL Server 报表设计器来创建报表可以跟踪团队的进度. 在可以使这些报表基于 Visual ...

  7. vs2017c语言没有空项目,「vs2017新建项目」visual studio 2017 创建空项目和桌面向导下的空项目...

    vs2017新建项目: visual studio 2017 创建空项目和桌面向导下的空项目 用VS2013编写和调试C语言程序,首先应建立项目工程.文件-->新建-->项目在 新建项目窗 ...

  8. .NET 项目 在 Visual Studio 各种版本间的转换

    刚进新公司一周,而新公司的项目是在VS2008的环境中开发的. 但是,已经习惯了VS2010的各种扩展给我带来的便利. 于是,自主的转换成了Vs2010打开的项目. 然后,又将源码提交到团队管理中了. ...

  9. 如何处理Angular项目在Visual Studio Code打开报关于@Decorators的警告信息

    我最近用Visual Studio Code开发Angular项目时,打开app.component.ts, 就遇到如下的警告消息: Experimental support for decorato ...

最新文章

  1. javascript 语言标准 es6简介
  2. java垃圾回收机制(简述)
  3. PHP Cookie处理
  4. Linux 终端(TTY)
  5. Golang Clearing slice
  6. Qt文档阅读笔记-QWebPage官方解析与实例
  7. 这售价要抢疯了?iPhone SE 2再曝光:将搭载A13芯片
  8. 理解python - 类
  9. java三大特性面试回答_面试题解3-Java的三大特征
  10. Android 集成支付宝支付
  11. *新手看php手册的正确姿势
  12. LIO-SAM论文翻译
  13. 区块链技术的应用和数字资产,将会是未来不可阻挡的趋势和潮流
  14. 城市精细化治理过程中的智能图像识别如何更精准、更智能?
  15. 瑞吉外卖项目重难点及易错点知识点总结
  16. AutoJs学习-读写手机联系人
  17. presentViewController: 如何不覆盖原先的 viewController界面
  18. Java SQLException: Subquery returns more than 1 row 问题解决
  19. rs232读取智能电表_智能电表防窃电原理 偷电为什么会被发现
  20. 淘宝界面实现以及登录注册界面

热门文章

  1. python聚类dbscan案例经纬度_用DBSCAN聚类经纬度坐标
  2. 开发一个出生年份的下拉选择框供用户选择_你的下拉式菜单设计对了吗?
  3. qt geomery的单位是什么_斜管沉淀池的原理是什么?
  4. php获取当天的开始时间和结束时间
  5. PHP中的PHP_EOL变量
  6. 科学计算机的显示怎么调整成出厂设置,笔记本电脑怎么恢复出厂设置
  7. java运行机制以及 运行流程
  8. linux svn 自动发布,linux svn tomcat maven 自动发布打包
  9. 和功率的计算公式_电机功率计算公式是什么?
  10. qtextedit非编辑时去边框_Photoshop玩腻了!这10个图形编辑神器你知道吗