任何一门编程语言都离不开对各种工具包的应用,工具包的治理就显得异样重要了。Go 的包治理形式是逐步演进的,本文介绍Go语言的两种包管理模式。

GOPATH模式引包(不举荐)

在 1.5 版本之前,所有的依赖包都是寄存在 GOPATH 下,没有多版本控制。

go的编译器会在 $GOPATH/src 上面寻找对应的模块,src 下的每一个目录都能够对应一个模块,目录中的目录也能够是一个模块

上面展现如何在入口文件main.go 里引入非标准库model包中的变量

  1. 目录层级如下
├───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
  1. 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(默认值)。

  1. GO111MODULE=off,go命令即将不会反对module性能,寻找依赖包的形式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找(也就是本文最开始介绍的形式)。
  2. GO111MODULE=on,go命令行会应用modules,不会去GOPATH目录下查找所援用的包。
  3. GO111MODULE=auto,默认值,go命令即将会依据当前目录来决定是否启用module性能。这种状况下能够分为两种情景:

    • 当前目录在GOPATH/src之外且该目录蕴含go.mod文件
    • 以后文件在蕴含go.mod文件的目录上面。
当modules性能启用时,依赖包的寄存地位变更为$GOPATH/pkg,容许同一个package多个版本并存,且多个我的项目能够共享缓存module

利用GO111MODULEGOPROXY,能够间接将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)

留神:

  1. indirect正文的代表间接依赖,没有的代表间接依赖
  2. 后面是版本号+工夫戳+hash(如:v0.0.0-20190620200207-3b0461eec859
  1. go.mod文件一旦创立后,它的内容将会被go toolchain全面掌控。go toolchain会在各类命令执行时(比方go get、go build、go mod等),批改保护go.mod文件。
  2. go.mod 提供了module, require、replace和exclude 四个命令

    • module 语句指定包的名字(门路)
    • require 语句指定的依赖项模块
    • replace 语句能够替换依赖项模块
    • exclude 语句能够疏忽依赖项模块

2、增加依赖

  1. 新建main.go文件
  2. 执行 go run main.go

    • 一般来说 go mod 模式下,运行 go run 会主动装置所有依赖,然而没有装置
    • 运行 go get ./ ... 能够主动查找并下载安装所有的包
    • 运行 go get [email protected] 装置指定版本的依赖包

3、查看依赖

  • go list -m all 查看以后模块所依赖的包列表
  • go mod tidygo.mod 中移除不须要的依赖

4、go.sum文件

用来做包版本治理

go.sum文件与go.mod文件同级。go.sum文件是对导入的依赖包的特定版本的hash校验值,作用就是记录第一次下载的依赖版本号,避免有依赖版本升级带来的不兼容问题。所以,go.modgo.sum文件都须要被退出版本治理中。

总结

  1. GOPATH模式 是 go在 1.5 版本之前的包管理模式,不具备版本控制性能,且所有我的项目的依赖都放在 GOPATH 外面,治理比拟凌乱
  2. GO MODULE 模式是go在1.11 版本推出的,应用git的治理形式,间接从GitHub上下载所须要的依赖,可能会存在一些安全性问题,同时国内须要设置GOPROXY代理服务器才可应用,相对来说好用一点。

包管理模式始终是各个开发语言所面临的辣手问题,比方NPMYarn,设计一种完满的包管理模式还须要一直摸索实际。

我是 甜点cc

酷爱前端开发,也喜爱专研各种跟本职工作关系不大的技术,技术、产品趣味宽泛且浓重。本号次要致力于分享集体经验总结,心愿能够给一小部分人一些渺小帮忙。

心愿能和大家一起致力营造一个良好的学习气氛,为了集体和家庭、为了我国的互联网物联网技术、数字化转型、数字经济倒退做一点点奉献。数风流人物还看中国、看今朝、看你我。

本文由mdnice多平台公布