Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang中的包管理工具 - Go Modules

Golang中的包管理工具 - Go Modules

作者头像
猿哥
发布于 2019-08-01 04:24:22
发布于 2019-08-01 04:24:22
1.6K00
代码可运行
举报
文章被收录于专栏:Web技术布道师Web技术布道师
运行总次数:0
代码可运行

GO包管理的前世今生

先来了解下Go包管理的发展历程

GOPATH

在Go1.5之前使用GOROOT和GOPATH这2个系统环境变量来决定包的位置,对于开发者主要使用GOPATH。GOPATH 解决了第三方源码依赖的问题,看一下我本机 $GOPATH/src 下的目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ tree -L 1 $GOPATH/src/
/Users/dongwm/src/
├── github.com
├── golang.org
├── google.golang.org
└── gopkg.in

5 directories, 0 files

如果执行 go get github.com/UserA/ProjectB ,就会把对应的内容里下载到 $GOPATH/src/github.com/UserA/ProjectB 目录。如果在代码中引用这个依赖,需要这么写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import "github.com/UserA/ProjectB"

go会去到$GOPATH下面找这个路径,就能找到这个包了。

一开始Golang这么设计是有原因的,因为Google是一个实践Mono Repo(把所有的相关项目都放在一个仓库中)的公司。但更多的公司和组织更多的是用Multi Repo(按模块分为多个仓库)。GOPATH在一定程度上简化了项目构建,但是这种系统级别的环境变量,要求你的全部项目必须位于 GOPATH 下,否则编译器找不到它。如果想要使用你自己的项目组织结构,要么你需要为每个项目设置一个 GOPATH,或者使用软链接来实现。

另外由于GOPATH对其管理下的库不能区分版本,都是指master最新代码,就有了依赖包的管理问题。举个例子,2个项目都依赖了库X,但是A项目要求库的v1版本,B项目要求库的版本是v2版本。那必须设置两个GOPATH来区分,并且在切换工程的时候GOPATH也得切换,徒增开发和实现的复杂度。当然这么设计也是收到了Google 内部广泛使用的基于主干 (trunk/mainline based) 的开发模型影响。所以说GOPATH带有鲜明的Google色彩。

Go Vendoring

到了 2014 年,有人提出了 external packages 的概念,在项目的目录下增加一个 vendor 目录来存放外部的包,同时让 go 的 tools 能够感知到这是一个 vendor。在Go 1.5 中vendor作为试验推出,在Go 1.6中作为默认参数被启用。

在这种模式下,会将第三方依赖的源码下载到本地,不同项目下可以有自己不同的vendor。但是这样做又引入了新的问题,因为随着项目的依赖增多,代码库会越来越大,尤其很多带前端资源的项目,几十M到几百M都是很常见的,你的项目可以就依赖它某一点内容,但是却集成了全部资源。

百花齐放

基于前面的问题,Golang 团队成员确定意识到要对包管理提出一个统一的规则。但是问题不是没有规则,而是规则太多了。往往就是一个意见不合,一下子就杀出来一个新的工具。仅官方推荐的包管理工具就有 15 种之多。其中著名的包含如下几个:

  1. Godep。它的原理是扫描记录版本控制的信息,并在go命令前加壳来做到依赖管理。
  2. Govendor。Govendor是在vendor之后出来的,功能相对Godep多一点,不过就核心问题的解决来说基本是一样的,知不是在vendor目录下通过 vendor.json 文件来记录依赖包的版本。
  3. Glide。它算是一个完整的包管理工具,比较像Node里面的npm或者Python里面的pip/pipenv,它通过 glide.yaml 记录依赖信息,通过 glide.lock 文件追踪每个包的具体修改(这样就能够重用依赖树)。
dep

对于从零构建项目的新用户来说,Glide功能足够,是个不错的选择。由于那个时间点Golang 依赖管理工具混乱,最终由谁终结这个场面需要官方来决定。后来Golang官方接纳了由社区组织合作开发的 dep 为 official experiment (Go 1.9),在相当长的一段时间里面作为标准成为事实上的官方包管理工具。

由于dep已经成为了 official experiment 的过去时,现在我们就不必再去学习了,直接去了解谁才是未来的 official experiment

Go Modules

Modules是Go 1.11中新增的实验性功能,基于vgo演变而来,是Golang官方的包管理工具,本文就来感受一下它。

先铺垫点准备知识。通常我们会在一个Repo(仓库)中创建一组Go Package。举个例子Gorm中共有5个包,一个是gorm,还有4个不同数据库驱动,这么用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import (
  "github.com/jinzhu/gorm"
  _ "github.com/jinzhu/gorm/dialects/sqlite"
)

Go 1.11给这样的一组在同一Repo下面的packages赋予了一个新的抽象概念: module,module是可以版本化的。使用Modules启用一个新的文件go.mod记录module的元信息。

当然一个Repo下也可以有多个module。

如何激活Modules?

首先要确保你使用的Go要>=1.11,目前我本地的是最新的1.12所以不需要升级Go:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ go version
go version go1.12.6 darwin/amd64

再则,目前Modules并不是默认启用的,可以通过环境变量GO111MODULE开启或者关闭,它有三个可选值:off、on、auto,默认值是 auto。

  1. off。关闭支持,go 会从GOPATH和vendor文件夹寻找包。
  2. on。开启支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据go.mod下载依赖。
  3. auto。当项目在$GOPATH/src外,且项目根目录有go.mod文件时,开启模块支持。

注意,使用Modules后就不再依赖GOPATH了,但目前我推荐用auto,因为还有一些库没有支持Go Modules,相信从很快就发布的Go 1.13开始,GOPATH就会逐渐退出Go开发者是视线了。届时就不需要 export GOPATH ,忘掉它吧!

使用Go Modules

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export GO111MODULE=on  # 对于当前终端会一直让Go Modules在开启状态
❯ go mod init hello  # 初始化,创建hello.mod文件
go: creating new go.mod: module hello
❯ ls
go.mod
❯ cat go.mod
module hello

go 1.12

默认的go.mod里面只定义了module名字是hello,并指定了Go的版本。接着创建一个程序hello.go:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
  log "github.com/sirupsen/logrus"
)

func main() {
  log.WithFields(log.Fields{
    "animal": "walrus",
  }).Info("A walrus appears")
}

这里面用了第三方的包 github.com/sirupsen/logrus ,在main函数中打印了一个日志。构建一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ go build
go: finding github.com/sirupsen/logrus v1.4.2
go: downloading github.com/sirupsen/logrus v1.4.2
go: extracting github.com/sirupsen/logrus v1.4.2
go: finding github.com/stretchr/objx v0.1.1
go: finding github.com/stretchr/testify v1.2.2
go: finding github.com/davecgh/go-spew v1.1.1
go: finding github.com/pmezard/go-difflib v1.0.0
go: finding github.com/konsorten/go-windows-terminal-sequences v1.0.1
go: finding golang.org/x/sys v0.0.0-20190422165155-953cdadca894
go: downloading golang.org/x/sys v0.0.0-20190422165155-953cdadca894
go: extracting golang.org/x/sys v0.0.0-20190422165155-953cdadca894
❯ ./hello
INFO[0000] A walrus appears                              animal=walrus

构建过程会更新go.mod文件(在执行go get、go build、 go test、 go list等命令时都会根据需要的依赖自动和更新require语句):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ cat go.mod
module hello

go 1.12

require github.com/sirupsen/logrus v1.4.2

显示的用require声明依赖 github.com/sirupsen/logrus ,版本为1.4.2。这个 v1.4.2 是一个semver标签,就是语义化版本号。它的格式应该是 v(major).(minor).(patch)

  1. v不可省略
  2. major: 当做了不兼容的升级时升
  3. minor: 当做了向前兼容的升级时升
  4. patch: 未改变功能,只是修了bug之类的问题时升

具体的语义化内容可以看延伸阅读链接6。另外在目录下新增了go.sum文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ cat go.sum
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

这个文件表示了logrus依赖的那些包的具体版本和hash值。它的作用相当于Npm里面的package-lock.json。

这些依赖的包都会被下载到 $GOPATH/pkg/mod 中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ tree $GOPATH/pkg/mod/github.com/ -L 2
/Users/dongweiming/.go/pkg/mod/github.com/
├── davecgh
│   └── go-spew@v1.1.1
├── konsorten
│   └── go-windows-terminal-sequences@v1.0.1
├── pmezard
│   └── go-difflib@v1.0.0
├── sirupsen
│   └── logrus@v1.4.2
└── stretchr
    ├── objx@v0.1.1
    └── testify@v1.2.2

11 directories, 0 files

github.com/sirupsen/logrus 用了这些依赖包对应的版本,其实就是在它的go.mod里面定义的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ cat $GOPATH/pkg/mod/github.com/sirupsen/logrus@v1.4.2/go.mod
module github.com/sirupsen/logrus

require (
	github.com/davecgh/go-spew v1.1.1 // indirect
	github.com/konsorten/go-windows-terminal-sequences v1.0.1
	github.com/pmezard/go-difflib v1.0.0 // indirect
	github.com/stretchr/objx v0.1.1 // indirect
	github.com/stretchr/testify v1.2.2
	golang.org/x/sys v0.0.0-20190422165155-953cdadca894
)

其中indirect表示间接引用。GoModules支持很多包管理命令,常用的go mod命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ go list -m all  # 列出全部依赖包
hello
github.com/davecgh/go-spew v1.1.1
github.com/konsorten/go-windows-terminal-sequences v1.0.1
github.com/pmezard/go-difflib v1.0.0
github.com/sirupsen/logrus v1.4.2
github.com/stretchr/objx v0.1.1
github.com/stretchr/testify v1.2.2
golang.org/x/sys v0.0.0-20190422165155-953cdadca894
❯ go get github.com/sirupsen/logrus@v1.4.1  # 下载指定版本的module(非最新)
❯ grep logrus go.mod
	github.com/sirupsen/logrus v1.4.1
❯ go get -u github.com/sirupsen/logrus  # 更新到最新
❯ grep logrus go.mod
	github.com/sirupsen/logrus v1.4.2
❯ tree $GOPATH/pkg/mod/github.com/sirupsen -L 1
/Users/dongweiming/.go/pkg/mod/github.com/sirupsen
├── logrus@v1.4.1
└── logrus@v1.4.2

可以看到本地有了2个版本的 github.com/sirupsen/logrus ,按需使用之。另外还可以使用 go get -u=patch 升级到最新的修订版本。

发布到Github

如果你希望你的包被别人使用就需要发布到Github或者其他平台上。首先在Github创建一个项目,然后克隆下来,再把前面创建的三个文件拷贝进来,不过go.mod中的module和package要改一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ git clone https://github.com/golang-dev/helloworld
❯ cd hello
❯ head -n1 go.mod
module github.com/golang-dev/helloworld

为了方便大家体验,创建分支v1存储第一个版本,并发布v1.0.0版本(省略git add /commit等操作):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ gco -b v1
❯ git push -u origin v1
❯ git tag v1.0.0  # 创建v1.0.0版本
❯ git push --tags
❯ gco master  # 切回master分支

在下一个版本中替换日志库,改用zap:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package hello

import (
	"time"

	"go.uber.org/zap"
)

func Test() {
	sugar := zap.NewExample().Sugar()
	defer sugar.Sync()
	sugar.Infow("failed to fetch URL",
		"url", "http://example.com",
		"attempt", 3,
		"backoff", time.Second,
	)
}

func main() {
    Test()
}

注意为了让包可导出,package 后面不是main而是hello。在执行 go build 之后,go.mod和go.sum都改变了,都添加了相关的依赖信息。如go.mod:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
diff --git a/go.mod b/go.mod
index 668236a..e6fff1d 100644
--- a/go.mod
+++ b/go.mod
@@ -6,5 +6,9 @@ require (
        github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
        github.com/sirupsen/logrus v1.4.2
        github.com/stretchr/testify v1.3.0 // indirect
+       github.com/uber-go/zap v1.10.0
+       go.uber.org/atomic v1.4.0 // indirect
+       go.uber.org/multierr v1.1.0 // indirect
+       go.uber.org/zap v1.10.0
        golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e // indirect
 )

这个时候可以使用tidy清理那些用不到的包(发布前都应该清理一下):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ go mod tidy

接着发布成v2版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ gco -b v1.01
❯ git push -f origin v1.01
❯ git tag v1.01
❯ git push --tags

现在 github.com/golang-dev/helloworld 就有2个版本了。

然后在另外一个目录下初始化一个新的go.mod就可以依赖并使用它了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ cd ~/strconv.code/modules/github
❯ go mod init hello2
❯ go get github.com/golang-dev/helloworld@v1  # 先安装v1版本的
❯ cat go.mod
module hello2

go 1.12

require github.com/golang-dev/hello v1.0.0 // indirect

然后写一个简单的例子运行一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ cat test.go
package main

import (
	hello "github.com/golang-dev/helloworld"
)

func main() {
	hello.Test()
}
❯ go run test.go
INFO[0000] A walrus appears                              animal=walrus

这样可以用hello包里面导出的函数Test了。当然,我这里仅仅是为了测试,这个包完全没有用!

接着下载最新的hello包版本再体验:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ go get -u github.com/golang-dev/helloworld
go: finding github.com/golang-dev/helloworld v1.0.1
...
❯ go run test.go
{"level":"info","msg":"failed to fetch URL","url":"http://example.com","attempt":3,"backoff":"1s"}

这样就更新到最新的版本1.0.1了。

后记

Modules将成为Go 1.13默认的依赖包管理方法。目前很多开源项目已经改用Go Modules,如果你在Github上看到项目根目录下包含go.mod 和 go.sum 就说明它支持最新的Go Modules。如果大家之后再开源新的项目,应该支持Go Modules。

代码地址

完整代码可以在 这个地址 和 这个项目 找到。

原文:https://strconv.com/posts/go-modules/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PHP技术大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go 模块--开始使用Go Modules
Go的1.11和1.12版本包括对模块--新的Go依赖管理系统的初步支持,使依赖版本信息变得明确且更易于管理。这篇博客文章介绍了开始使用模块所需的基本操作。
KevinYan
2020/01/14
2.6K0
go module
go 1.5 引进了vendor管理工程依赖包,但是vendor的存放路径是在GOPATH底下,另外每个依赖还可以有自己的vendor,通常会弄得很乱,尽管dep管理工具可以将vendor平级化管理,但是相对GOPATH的路径是逃不掉的。另外,各个包的版本管理也显得原始,甚至有的开发将依赖包从github直接download下来自己放到GOPATH底下的vendor。go的依赖包管理一致是开发者诟病的一个痛点。所以在千呼万唤中,go 1.11 终于引进了go module管理工程的包依赖,去除了项目包管理对GOPATH的依赖,明确了依赖包的版本管理。
用户2937493
2019/09/10
1.3K0
go module
[日常] gocron源码阅读-使用go mod管理依赖源码启动gocron
从 Go1.11 开始,golang 官方支持了新的依赖管理工具go mod go mod download: 下载依赖的 module 到本地 cache go mod edit: 编辑 go.mod go mod graph: 打印模块依赖图 go mod init: 在当前目录下初始化 go.mod(就是会新建一个 go.mod 文件) go mod tidy: 整理依赖关系,会添加丢失的 module,删除不需要的 module go mod vender: 将依赖复制到 vendor 下 go mod verify: 校验依赖 go mod why: 解释为什么需要依赖
唯一Chat
2019/11/14
8820
Go语言重新开始,Go Modules的前世今生与基本使用
2020年腾讯内部的一份开发者报告显示,Go语言已经成为腾讯内部第二大后端开发语言,在腾讯每天有大量的Go开发者在做业务和平台开发,大量的团队和项目使用也暴露出一些问题,随着Go Modules的出现,类似于内部自签发证书、安全审计等这些问题也逐渐得到解决。 笔者在腾讯当前负责腾讯云在Go编程语言使用上的一些问题,2021年初开始负责内部goproxy服务并推广Go Modules使用,这些技术支撑了腾讯云、微信、腾讯视频、腾讯游戏、腾讯音乐、腾讯会议等明星产品,并与公司内部软件源团队、工蜂团队、
腾讯云开发者
2021/11/25
6690
用go-module作为包管理器搭建go的web服务器
本篇博客主要介绍了如何从零开始,使用Go Module作为依赖管理,基于Gin来一步一步搭建Go的Web服务器。并使用Endless来使服务器平滑重启,使用Swagger来自动生成Api文档。
SH的全栈笔记
2019/10/20
1.7K0
Go语言重新开始,Go Modules 的前世今生与基本使用
2020 年腾讯内部的一份开发者报告显示,Go 语言已经成为腾讯内部第二大后端开发语言,在腾讯每天有大量的 Go 开发者在做业务和平台开发,大量的团队和项目使用也暴露出一些问题,随着 Go Modules 的出现,类似于内部自签发证书、安全审计等这些问题也逐渐得到解决。
Bain
2021/11/02
7960
Go语言重新开始,Go Modules 的前世今生与基本使用
GO 依赖管理工具go Modules(官方推荐)
以前写过一篇关于go管理依赖包工具 dep的文章,当时认为dep将会成为官方依赖工具,现在看来是自己图样图斯内幕破了,正如官方一直提到dep是“official experiment”官方实验项目的那样,随着go modules 在go1.11版推出,go1.12版功能不断改进,再到go1.13版完善优化,正式扶正。预计dep将来也只能定格在“official experiment”了。
孤烟
2020/09/27
1.8K1
官方golang包管理神器,值得一试!
我们上次说过如何让一个项目在 Goland 编译器跑起来,但是要自己去下包,要花不少时间找包下包,是不是很麻烦?
机智的程序员小熊
2020/05/20
2.6K0
Go Module详细使用教程,包管理不在难
go modules是 golang 1.11引入的新特性。模块是相关Go包的集合。modules是源代码交换和版本控制的单元。go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。
公号:咻咻ing
2020/03/04
20.6K0
GOPATH 模式怎么迁移至 Modules 模式?
Go 项目使用多种依赖管理策略。诸如 dep 和 glide 很受欢迎,但是它们在使用上有很大差异,并且并不总是能很好地协同工作。某些项目将其整个 GOPATH 目录存储在单个 Git 存储库中。其他人只是依靠 go get 获取,并期望在 GOPATH 中安装相当新版本的依赖项。
frank.
2020/11/12
2.2K0
层次分明井然有条,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang包管理机制(package)EP10
    Go lang使用包(package)这种概念元素来统筹代码,所有代码功能上的可调用性都定义在包这个级别,如果我们需要调用依赖,那就“导包”就行了,无论是内部的还是外部的,使用import关键字即可。但事情往往没有那么简单,Go lang在包管理机制上走了不少弯路,虽然1.18版本的包管理已经趋于成熟,但前事不忘后事之师,我们还是需要了解一下这段历史。
用户9127725
2022/09/21
2520
Go的包管理学习笔记
大部分语言都有版本管理工具,比如nodejs的npm,python中的pip,java里的maven,但是go语言的版本管理经历了漫长的演进历程:
Johns
2021/08/11
1.2K0
深入理解 Go Modules 的 go.mod 与 go.sum
流行的现代编程语言一般都提供依赖库管理工具,如 Java 的 Maven 、Python 的 PIP、Node.js 的 NPM 和 Rust 的 Cargo 等。Go 最为一门新生代语言,自然也有其自己的库管理方式。
恋喵大鲤鱼
2022/06/12
15K0
深入理解 Go Modules 的 go.mod 与 go.sum
Golang Module的使用 顶
注意:go mod 还有一些其他比较有意思的工具,比如可以打印依赖树,比如可以查看哪些模块在哪些包引用了
BGBiao
2019/09/09
1.3K0
golang go 包管理工具 go mod的详细介绍
在一个非go path的路径中新建一个项目,然后使用go mod init 就可以初始化一个新的包(要开启这个 export GO111MODULE=on写入.bash_profile即可 win的同学自己找找设置 GO111MODULE的win版本设置方法哈),其实跟github(gitlab都行)用在一起更好
李海彬
2019/03/07
15.5K0
golang go 包管理工具 go mod的详细介绍
Go包管理工具
想想Java的Maven, Nodejs的NPM,还有我们赞颂一万遍也不过分的Python包管理,为什么生命总要浪费在这些事情上面呢? 陷入了深深的沉思~~
happy123.me
2019/12/30
6980
golang mod 入门
go modules 是 golang 1.11 新加的特性。现在1.12 已经发布了,是时候用起来了。Modules官方定义为:
goodspeed
2020/12/22
8490
迁移到 Go Modules
Go 项目使用多种依赖管理策略,其中对 vendor 包的管理有两个比较流行的工具 dep 和 glide,但他们在行为上有很大的差异,而且并不是总能很好地同时使用。一些项目将其整个 GOPATH 目录存储在一个 Git 仓库中。其他人则只依赖于 go get 并期望在GOPATH中安装较新版本的依赖项。
恋喵大鲤鱼
2020/09/08
8500
Go 编程 | 连载 21 - Go Modules 和 Package
GOPATH 是 Go 语言中使用的一个环境变量,它使用绝对路径提供项目的共工作目录,GOPATH 适合处理大量 Go 语言源码、多个包组合而成的复杂工程。
RiemannHypothesis
2022/09/28
5200
Go的包管理工具(三):Go Modules
在前面的文章,我们先是介绍了Go 的几种包管理方式,然后具体介绍了一种包管理的工具:glide。随着 Go 1.11 的发布,官方的包管理工具 Go Modules 变得流行起来。在发布不久的 Go 1.12 版本中,增强了对 Go Modules 的支持。本文将会介绍如何在项目中安装和使用 Go Modules 。
aoho求索
2019/05/07
1.5K0
相关推荐
Go 模块--开始使用Go Modules
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验