数科院博客园 - 包管理
type: channel
link: https://blog.icsc.vip/index.php/tag/包管理/
items: go mod简单使用
items: golong modules包管理工具
items: govendor管理包工具

go mod简单使用
type: item
date: 2019-10-19T08:49:00+00:00
description: 查看go mod命令：PS C:\Users\zhaoh\go> go mod help The commands are: download download modules to local cache edit edit go.mod from tools or scripts graph print module requirement graph init initialize new module in current directory tidy add missing and remove unused modules vendor make vendored copy of dependencies verify verify dependencies have expected content why explain why packages or modules are needed Use "go help mod <command>" for more information about a command. download 将模块下载到本地缓存 edit 从工具或者脚本编辑go.mod graph 打印模块需求图 init 初始化当前目录中的新模块 tidy 添加丢失的和删除未使用的模块 vendor 创建依赖项的vendored副本 verify 验证依赖项是否具有预期的内容 why 解释为什么需要包或模块在非GOPATH目录下初始化当前新模块，会多出来一个go.mod文件,记录的是依赖管理。PS C:\Users\zhaoh\go> cd ../ PS C:\Users\zhaoh> mkdir hello 目录: C:\Users\zhaoh Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2019/10/18 17:21 hello PS C:\Users\zhaoh> cd hello PS C:\Users\zhaoh\hello> go mod init hello go: creating new go.mod: module hello PS C:\Users\zhaoh\hello> ls 目录: C:\Users\zhaoh\hello Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2019/10/18 17:25 13 go.mod PS C:\Users\zhaoh\hello> cat go.mod module hello在hello下新建一个main.go文件。package main import ( "fmt" ) func main() { fmt.Println("hello world") } 在终端执行go run命令：PS C:\Users\zhaoh\hello> go run main.go hello world PS C:\Users\zhaoh\hello> cat go.mod module hello require github.com/labstack/echo v3.3.10+incompatible // indirect PS C:\Users\zhaoh\hello> cat go.sum github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg= github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= PS C:\Users\zhaoh\hello>可以发现go.mod文件已经发生变化，并且多出来一个go.sum文件，用来记录版本变更。要注意一下虽然是在非GOPATH路径下执行go mod命令，但go mod下载的依赖包依旧储存在GOPATH的pkg下：!

golong modules包管理工具
type: item
date: 2019-08-10T01:47:00+00:00
description: moudle是一个强大的包管理工具，go从1.11版本才开始支持modules,我们可以查看一下我们得go版本是否符合，如果不符合我们就得升级到我们得最新版本或者次新版本了，我们可以直接在命令行输入命令 go get -u:直接升级到次要版本或者修订版本 go get -u=patch:升级到最新修订版本 go get package@version:升级到指定版本号的版本那么我们该怎样激活使用它呢，首先我们设置环境变量GO111MODULE=on,这个命令是允许go使用Modules命令，或者我们可以在go环境变量之外直接使用，不用设置环境变量。我们设置好了之后我们直接在项目中初始化，我们可以直接使用go mod init命令，执行完这个命令之后在当前项目下会出现两个文件一个是go.mod一个是go.sum。go.mod里面存放的是添加的各种依赖信息。 如果我们在gopath之外创建新的项目，我们可以go mod init packagename命令创建一个空的go.mod，然后我们自己在go.mod中添加各种所需要的依赖，或者让go自己发现可是可以的。我觉得这个modules真正强大的地方是可以翻墙下载各种包，在我们访问golang.org/x的包时需要翻墙，这时候我们头疼不已，有的时候这个包里还需要依赖别的包，难道我们要一直找包下载包么，这回浪费掉我们大把时间，我们可以通过代理直接去下载，我们需要添加环境变量GOPROXY=https://goproxy.io，然后我们就可以直接使用go mod tidy来添加依赖并且删除不需要的依赖关系。gomod命令：download download modules to local cache (下载依赖的module到本地cache)) edit edit go.mod from tools or scripts (编辑go.mod文件) graph print module requirement graph (打印模块依赖图)) init initialize new module in current directory (再当前文件夹下初始化一个新的module, 创建go.mod文件)) tidy add missing and remove unused modules (增加丢失的module，去掉未用的module) vendor make vendored copy of dependencies (将依赖复制到vendor下) verify verify dependencies have expected content (校验依赖) why explain why packages or modules are needed (解释为什么需要依赖)

govendor管理包工具
type: item
date: 2019-06-17T13:10:00+00:00
description: govendor管理工具为什么使用govendor管理工具？当我们在本地要开发多个项目时，如果不同的项目需要依赖某个第三方包的不同版本，这时候仅仅通过全局的 GOPATH 来存放第三方包是无解的。解决方法有一个，那就是需要在不同的项目里设置不同的 GOPATH 变量来解决冲突问题。但是这还是不能解决一个重要的问题，那就是当我们的项目依赖了两个第三方包，这两个第三方包又同时依赖了另一个包的两个不同版本，这时候就会再次发生冲突。这种多版本依赖有一个专业的名称叫「钻石型」依赖。为了解决这个问题，Go 1.6 引入了 vendor 机制。这个机制非常简单，就是在你自己项目的目录下增加一个名字为 vendor 子目录，将自己项目依赖的所有第三方包放到 vendor 目录里。这样当你导入第三方包的时候，优先去 vendor 目录里找你需要的第三方包，如果没有，再去 GOPATH 全局路径下找。然后每个第三方项目都会有自己的 vendor 子目录，如此递归下去，可以想象，一个大型项目将会有一颗很深的依赖树。不过实际上这颗依赖数没你想象的那么深，因为 Go 的第三方开源包普遍比较轻量级，依赖不是很多。毕竟 Go 语言已经将很多互联网常用的工具包都内置了。1.安装govendor go get -u github.com/kardianos/govendor2.配置环境变量 将$GOPATH/bin/添加至path中3.测试 在自己的$GOPATH/src下创建一个名为go_test的测试项目，然后进入此目录下执行：govendor init命令进行初始化操作，此时此目录下会生成一个vendor文件夹，和一个json文件。 4.加载测试包 输入命令govendor fetch github.com/pkg/errors，此时系统会将errors包下载到vendor目录下，并更新vendor.json配置文件 命令大全init 初始化 vendor 目录list 列出所有的依赖包add 添加包到 vendor 目录，如 govendor add +external 添加所有外部包add PKG_PATH 添加指定的依赖包到 vendor 目录update 从 $GOPATH 更新依赖包到 vendor 目录remove 从 vendor 管理中删除依赖status 列出所有缺失、过期和修改过的包fetch 添加或更新包到本地 vendor 目录sync 本地存在 vendor.json 时候拉去依赖包，匹配所记录的版本get 类似 go get 目录，拉取依赖包到 vendor 目录常见错误： [WARN] Unable to checkout golang.org/x/sys/unix [ERROR] Error looking for golang.org/x/sys/unix: Cannot detect VCS如果出现此类错误是因为被墙的原因，需要在/etc/profile中设置一下代理然后source一下 #Proxy export http_proxy=socks5://127.0.0.1:xxxx export https_proxy=$http_proxy export ftp_proxy=$http_proxy export rsync_proxy=$http_proxy export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"