栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

GOPATH 与 Go 的依赖管理 Go Mod

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

GOPATH 与 Go 的依赖管理 Go Mod

依赖管理工具

使用 PHP 作为开发语言的同学都知道,最初引用外部类库包时需要一个个下载,然后再一个个手动导入;如果使用的外部类库中还有引用的类库万一没在包里,还得去找对应的类库包,然后再导入,非常麻烦;幸好后来有了 composer,所有的类库包都是集中式管理的,在一个地方就可以找到并一键下载引用,极大地方便了类库包的引用。

在 Go 语言中,第三方依赖的管理工具经过了一个漫长的发展过程。在 Go 1.11 发布之前 govendor、dep 等工具百花齐放。直到 Go mod 出现,开始一统天下。

在这之前 Go 的依赖非常简单粗暴,只要依赖源码就可以了。例如:

import  "github.com/jinzhu/gorm"

github.com/jinzhu/gorm 就是 gorm 的GitHub项目路径。

GOPATH时期

Go 在1.11 之前使用GOPATH模式进行依赖的管理。安装部署 Go 环境,使用 Go 进行开发的时候强制被要求要设置GOPATH(当然安装过程中也会默认指定$GOPATH=~/go)。 要在GOPATH路径下新建 src /bin /pkg文件夹。

➜ ~/go
├── bin  # 存储go编译生成的二进制可执行文件,一般会把该路径配置到PATH中,PATH=$PATH:$GOPATH/bin
├── pkg  # 存储预编译的目标文件,以加快后续的编译速度 
└── src  # 存储Go的源代码,一般以$GOPATH/src/github.com/foo/bar的路径存放

➜  go go env |grep GOPATH
GOPATH="/Users/bytedance/go"

在这种模式下,如果使用go get 拉取外部依赖会自动下载并安装到$GOPATH/src 目录下。

这种模式下,go get没有版本管理的概念,无法处理依赖不同版本的问题,因为同一个依赖都存在同一个路径下面。

在 Go 官方还没有推出 Go Modules 的时候,go的依赖管理工具可谓是百花齐放,例如 govendor, dep,但是最终Go Modules发布,平息了诸侯割据的局面。

GO Modules

Go1.11 开始推出 Go Modules , Go1.13 开始不再推荐使用 GOPATH。意思就是说你可以在任何路径下存放你的Go 源码文件, 不用再像以前一样非得放到$GOPATH/src中。 每一个 Go 项目 都是一个 Modules。

在 Go Modules 环境下出现了一个很重要的环境变量GO111MODULE

➜ ~ go env
GO111MODULE="auto"
GOPROXY="https://proxy.golang.org,direct"
GONOPROXY=""
GOSUMDB="sum.golang.org"
GONOSUMDB=""
GOPRIVATE=""
.
.
.

如果要对go 的环境变量进行设置,可以使用

go env -w GO111MODULE=on  # 设置go 环境变量
go env -u # 恢复初始设置
GO111MODULE

GO111MODULE 这个环境变量是用来作为使用Go Modules 的开关。可以说这个变量是历史产物,很有肯能会在将来Go的新版本中去除掉。

GO111MODULE="auto" # 只要项目包含了go.mod 文件的话就启用Go modules, 在Go1.11-1.14 中是默认值
GO111MODULE="on"   # 启用Go Modules
GO111MODULE="off"  # 禁用Go Modules, 对老的项目进行兼容
go mod
// 操作 go mod 的命令有
➜  ~ go mod
Go mod provides access to operations on modules.

Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality.
# 所有的go commands 都支持 modules。
Usage:

        go mod  [arguments]

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 " for more information about a command.

go mod init

在当前目录初始化一个新的module, 就是说将该目录下的工程文件初始化为一个Go Module.

// 如果当前目录在GOPATH中,这条命令无需传入参数,参数默认为 GOPATH/src 到该目录的相对路径。中
go mod

// 如果当前目录不在GOPATH中,要手动指定module的名字
go mod gomod

mod 创建完成之后,就可以在该目录下创建 Go 文件,然后运行起来了,如:

// 创建 hello.go
package main

import "fmt"

func main() {
	fmt.Println("hello world")
}

然后直接 go run hello.go

参考链接

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/944397.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号