摘自:

GOPATH和GOROOT

export GOROOT=$HOME/go1.9.3

GOPATH必须要设置,GOPATH告知go,需要代码(包括本项目即内部依赖和引用外部项目的代码即外部依赖)的时候去哪里查找。GOPATH可以随着项目的不同而重新设置。

GOPATH下会有3个目录:src、bin、pkg。

  • src目录:go编译时查找代码的地方;按照golang默认约定,go run,go install等命令的当前工作路径(即在此路径下执行上述命令)。
  • bin目录:go get这种bin工具的时候,二进制文件下载的目的地; golang编译可执行文件存放路径
  • pkg目录:golang编译包时,生成的.a文件存放路径。.a文件是编译过程中生成的,每个package都会生成对应的.a文件,Go在编译的时候先判断package的源码是否有改动,如果没有的话,就不再重新编译.a文件。

内部依赖管理

$GOPATH/src/

GOPATH来管理外部依赖

go get github.com/globalsign/mgo$GOPATH/src/github.com/globalsign/mgoimport github.com/globalsign/mgo
vendor
$GOPATH/src$GOPATH/src$GOPATH/src
govendor
#安装
go get -u github.com/kardianos/govendor # 进入项目的根目录
# 创建 vendor 文件夹和 vendor.json 文件,此时文件中只有本项目的信息
govendor init # 拷贝GOPATH下的代码到vendor目录中,更新vendor.json
govendor add +包名 # 列出已经存在的依赖包
govendor list # 找出使用的对应包
govendor list -v fmt # 拉取指定版本的包
govendor fetch golang.org/x/net/context@a4bbce9fcae005b22ae5443f6af064d80a6f5a55
govendor fetch golang.org/x/net/context@v1 # Get latest v1.*.* tag or branch.
govendor fetch golang.org/x/net/context@=v1 # Get the tag or branch named "v1".
Modules

go module 是go包的集合,是源代码交换和版本化控制的基本单元

go.modGOPATH

GO111MODULE

go moduleGO111MODULE=on
onoff
$GOPATH$GOROOT/src
auto

既有项目

module my/thing //模块名称

require (//要求的依赖项列表以及版本
one/thing v1.3.2
other/thing v2.5.0 // indirect
...
) exclude (//排除的依赖项,仅在当前模块为主模块时生效
bad/thing v0.7.3
) replace (//替换的依赖项,仅在当前模块为主模块时生效
src/thing 1.0.2 => dst/thing v1.1.0
)

新的项目

GOPATH
go mod init packagenamego.modrequire github.com/smallnest/rpcx latest
go mod download$GOPATH$GOPATH/pkg/mod

go mod命令

//download    下载依赖的module到本地cache
//edit edit go.mod from tools or scripts (编辑go.mod文件)
例如 go mod edit -require="github.com/chromedp/chromedp@v0.1.0",修改依赖关系使用chromedp 的v0.1.0版本
//tidy 增加丢失的module,去掉未用的module,如在项目的开发过程中, 依赖有变更, 可使用 go mod tidy 来应用这些变更到 go.mod 文件.
//graph print module requirement graph (打印模块依赖图))
//init 在当前文件夹下初始化一个新的module, 创建go.mod文件
//vendor 在项目发布时会要将依赖复制到项目中,会复制modules下载到vendor中, 貌似只会下载你代码中引用的库,而不是go.mod中定义全部的module。
//verify verify dependencies have expected content (校验依赖)
//why explain why packages or modules are needed (解释为什么需要依赖)
//go list -m -json all //依赖详情

集成

gogo buildgo installgo rungo testgo.modgo.sum

go get 升级

go get -ugo get -u=patchgo get package@versionversion

语义化版本

semverSemantic VersioningvX.Y.Z
  • 标记版本号的软件发行后,禁止(MUST NOT)改变该版本软件的内容。任何修改都必须(MUST)以新版本发行。

  • 标准的版本号必须(MUST)采用 X.Y.Z 的格式,其中 X、Y 和 Z 为非负的整数,且禁止(MUST NOT)在数字前方补零。X 是主版本号、Y 是次版本号、而 Z 为修订号。每个元素必须(MUST)以数值来递增。例如:1.9.1 -> 1.10.0 -> 1.11.0。

  • 版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

    1. 主版本号:当你做了不兼容的 API 修改。每当主版本号递增时,次版本号和修订号必须(MUST)归零。
    2. 次版本号:当你做了向下兼容的功能性新增,每当次版本号递增时,修订号必须(MUST)归零。
      • 如果同时依赖是 v1.5.0 和 v1.10.0,最小的兼容版本是 v1.10.0。
    3. 修订号:当你做了向下兼容的问题修正。这里的修正指的是针对不正确结果而进行的内部修改
      • 如果依赖写成 v1.0.5 和 v1.0.10,这两版本是兼容的,则选择最小版本依赖 v1.0.5