任何一门编程语言都离不开对各种工具包的应用,工具包的治理就显得异样重要了。Go 的包治理形式是逐步演进的,本文介绍Go语言的两种包管理模式。
GOPATH模式引包(不举荐)
在 1.5 版本之前,所有的依赖包都是寄存在 GOPATH
下,没有多版本控制。
go的编译器会在 $GOPATH/src
上面寻找对应的模块,src
下的每一个目录都能够对应一个模块,目录中的目录也能够是一个模块
上面展现如何在入口文件main.go
里引入非标准库model
包中的变量
- 目录层级如下
├───main│ main.go└───model utils.go
main/main.go
入口文件引入utils
外面的Name
变量model/utils.go
文件申明package model
,并定义变量var Name string = "xiao"
,变量必须是大写,否则报错name not exported by package model
- main.go 文件引model包
package mainimport ( "fmt" // 引包 // 省略GOPATH/src, Go编译的时候会主动在src目录下寻找 "go_code/pointer/model")func main() { fmt.Println(model.Name) // xiao}
开启GO111MODULE后非module我的项目产生的问题
在GO111MODULE=on
,并且曾经设置GOPATH
的条件下,写的代码在$GOPATH/src
下,我想要应用另一个package
外面的内容,并且这个package不是规范库,或者说不在GOROOT
里(个别咱们不会批改GOROOT中的内容),编译会报错,如下
package go_code/pointer/model is not in GOROOT
解决办法一:
设置GO111MODULE=off
go env -w GO111MODULE=off
设置完之后, go env
查看
而后从新编译即可
解决办法二
应用go mod
, 请看下文介绍
GO MODULE 模式引包(举荐)
go modules 是 golang 1.11 新加的个性。
- 模块是相干Go包的汇合
- modules是源代码替换和版本控制的单元
go命令间接反对应用modules,包含记录和解析对其余模块的依赖性。modules替换旧的基于GOPATH的办法来指定在给定构建中应用哪些源文件。
GO111MODULE 有三个值:off, on和auto(默认值)。
- GO111MODULE=off,go命令即将不会反对module性能,寻找依赖包的形式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找(也就是本文最开始介绍的形式)。
- GO111MODULE=on,go命令行会应用modules,不会去GOPATH目录下查找所援用的包。
GO111MODULE=auto,默认值,go命令即将会依据当前目录来决定是否启用module性能。这种状况下能够分为两种情景:
- 当前目录在
GOPATH/src
之外且该目录蕴含go.mod文件 - 以后文件在蕴含go.mod文件的目录上面。
- 当前目录在
当modules性能启用时,依赖包的寄存地位变更为$GOPATH/pkg
,容许同一个package多个版本并存,且多个我的项目能够共享缓存的module
利用GO111MODULE
和GOPROXY
,能够间接将Github上的第三方库间接下载到本地应用,不须要应用go get命令。执行 go run 运行时,GOMODULES包管理工具会主动帮咱们下载github下面的包
应用 go mod 创立新我的项目
当开启GO111MODULE
的时候,才能够应用go mod
1、初始化我的项目
mkdir test-modcd test-moego mod init maze-mod
在我的项目根目录生成 go.mod
文件
module test-modgo 1.17require github.com/astaxie/beego v1.12.1require ( golang.org/x/net v0.0.0-20190620200207-3b0461eec859 // indirect golang.org/x/text v0.3.0 // indirect)
留神:
- 有
indirect
正文的代表间接依赖,没有的代表间接依赖,- 后面是版本号+工夫戳+hash(如:
v0.0.0-20190620200207-3b0461eec859
)
go.mod
文件一旦创立后,它的内容将会被go toolchain
全面掌控。go toolchain
会在各类命令执行时(比方go get、go build、go mod等),批改保护go.mod
文件。go.mod
提供了module, require、replace和exclude 四个命令- module 语句指定包的名字(门路)
- require 语句指定的依赖项模块
- replace 语句能够替换依赖项模块
- exclude 语句能够疏忽依赖项模块
2、增加依赖
- 新建
main.go
文件 执行
go run main.go
- 一般来说
go mod
模式下,运行go run
会主动装置所有依赖,然而没有装置 - 运行
go get ./ ...
能够主动查找并下载安装所有的包 - 运行
go get [email protected]
装置指定版本的依赖包
- 一般来说
3、查看依赖
go list -m all
查看以后模块所依赖的包列表go mod tidy
从go.mod
中移除不须要的依赖
4、go.sum
文件
用来做包版本治理
go.sum
文件与go.mod
文件同级。go.sum
文件是对导入的依赖包的特定版本的hash
校验值,作用就是记录第一次下载的依赖版本号,避免有依赖版本升级带来的不兼容问题。所以,go.mod
和go.sum
文件都须要被退出版本治理中。
总结
GOPATH模式
是 go在 1.5 版本之前的包管理模式,不具备版本控制性能,且所有我的项目的依赖都放在 GOPATH 外面,治理比拟凌乱GO MODULE
模式是go在1.11 版本推出的,应用git的治理形式,间接从GitHub上下载所须要的依赖,可能会存在一些安全性问题,同时国内须要设置GOPROXY
代理服务器才可应用,相对来说好用一点。
包管理模式始终是各个开发语言所面临的辣手问题,比方NPM
和Yarn
,设计一种完满的包管理模式还须要一直摸索实际。
我是 甜点cc
酷爱前端开发,也喜爱专研各种跟本职工作关系不大的技术,技术、产品趣味宽泛且浓重。本号次要致力于分享集体经验总结,心愿能够给一小部分人一些渺小帮忙。
心愿能和大家一起致力营造一个良好的学习气氛,为了集体和家庭、为了我国的互联网物联网技术、数字化转型、数字经济倒退做一点点奉献。数风流人物还看中国、看今朝、看你我。
本文由mdnice多平台公布