共计 2715 个字符,预计需要花费 7 分钟才能阅读完成。
任何一门编程语言都离不开对各种工具包的应用,工具包的治理就显得异样重要了。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 main
import (
"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-mod
cd test-moe
go mod init maze-mod
在我的项目根目录生成 go.mod
文件
module test-mod
go 1.17
require github.com/astaxie/beego v1.12.1
require (
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 多平台公布