前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go——依赖管理

Go——依赖管理

作者头像
羊羽shine
发布于 2019-05-29 08:44:12
发布于 2019-05-29 08:44:12
1.4K00
代码可运行
举报
文章被收录于专栏:Golang开发Golang开发
运行总次数:0
代码可运行

vendor

在Go1.5 release的版本的发布vendor目录被添加到除了GOPATH和GOROOT之外的依赖目录查找的解决方法。 查找依赖包路径的解决 当前包下的vendor目录 先上级的目录查找,直到找到scr的vendor目录 在GOPATH下面查找依赖包 在GOROOT目录下查找

dep

dep安装方式的安装方式是:执行 curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5140  100  5140    0     0   3346      0  0:00:01  0:00:01 --:--:--  3346
ARCH = amd64
OS = linux
Will install into /home/baxiang/go/bin
Fetching https://github.com/golang/dep/releases/latest..
Release Tag = v0.5.0
Fetching https://github.com/golang/dep/releases/tag/v0.5.0..
Fetching https://github.com/golang/dep/releases/download/v0.5.0/dep-linux-amd64..
Setting executable permissions.
Moving executable to /home/baxiang/go/bin/dep

MacOS 使用 Homebrew安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ brew install dep
$ brew upgrade dep

Linux Apt安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt install go-dep

通过go get 按照

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go get -u github.com/golang/dep/cmd/dep
dep常用命令
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ dep
Dep is a tool for managing dependencies for Go projects

Usage: "dep [command]"

Commands:

  init     Set up a new Go project, or migrate an existing one
  status   Report the status of the project's dependencies
  ensure   Ensure a dependency is safely vendored in the project
  version  Show the dep version information
  check    Check if imports, Gopkg.toml, and Gopkg.lock are in sync

Examples:
  dep init                               set up a new project
  dep ensure                             install the project's dependencies
  dep ensure -update                     update the locked versions of all dependencies
  dep ensure -add github.com/pkg/errors  add a dependency to the project

Use "dep help [command]" for more information about a command.
初始化

文件目录结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ tree
.
├── Gopkg.lock
├── Gopkg.toml
└── vendor

1 directory, 2 files

图片.png

在Gopkg.toml编辑

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[[constraint]]
     name = "github.com/pkg/errors"
     source = "github.com/pkg/errors"
     version = "0.8.1"

[[constraint]]
     name = "github.com/gorilla/websocket"
     source = "github.com/gorilla/websocket"
     version = "1.4.0"

[[constraint]]
     name = "github.com/skip2/go-qrcode"
     source = "github.com/skip2/go-qrcode"
     branch = "master"

go mod

  1. 升级golang 版本到 1.12 Go下载 设置环境变量
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export GO111MODULE=on
bogon:~ baxiang$ source ~/.bash_profile
bogon:~ baxiang$ echo $GO111MODULE
auto

go mod 命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go mod help
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.

Usage:

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

go mod init [module]:初始化.mod 包管理文件到当前工程。 go mod vendor:vendor版本的解决方案,将依赖复制到vendor下面。 go mod tidy:移除未用的模块,以及添加缺失的模块。 go mod verify:验证所有模块是否正确。

初始化模块
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go mod init
go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'

在当前目录下,命令行运行 go mod init + 模块名称 初始化模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export GO111MODULE=on
$  go mod init server
go: creating new go.mod: module mServer
go: copying requirements from Gopkg.lock

运行完后,会在当前项目目录下生成一个go.mod 文件,这是一个关键文件,之后的包的管理都是通过这个文件管理。 除了go.mod之外,go命令还维护一个名为go.sum的文件,其中包含特定模块版本内容的预期加密哈希,go.sum 文件不需要手工维护。

go.mod工作机制

main.go文件:

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

import (
    "github.com/gin-contrib/pprof"
    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.Default()
    pprof.Register(router)
    router.Run(":8000")
}

按照过去的做法,要运行main.go需要执行go get 命令 下载gin包到 $GOPATH/src。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go get -u github.com/gin-gonic/gin

go 会自动查找代码中的包,下载依赖包,并且把具体的依赖关系和版本写入到go.mod和go.sum文件中。 查看go.mod,它会变成这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module baxiang.cn/GoNote

go 1.12

replace (
    golang.org/x/text => github.com/golang/text v0.3.0
    golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)

require (
    github.com/gin-contrib/pprof v1.2.0
    github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 // indirect
    github.com/gin-gonic/gin v1.3.0
    github.com/golang/protobuf v1.3.1 // indirect
    github.com/json-iterator/go v1.1.6 // indirect
    github.com/mattn/go-isatty v0.0.7 // indirect
    github.com/ugorji/go v1.1.4 // indirect
)

require关键子是引用,后面是包,最后v1.3.0 是引用的版本号 使用Go mod依赖的第三方包被默认下载到$GOPATH/pkg/mod路径下。

go mod使用vendor目录

如果你不喜欢 go mod 的缓存方式,你可以使用vendor命令回到 godep 或 govendor 使用的 vendor 目录进行包管理的方式。

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

当然这个命令并不能让你从godep之类的工具迁移到 go modules,它只是单纯地把 go.sum 中的所有依赖下载到 vendor 目录里,如果你用它迁移 godep 你会发现 vendor 目录里的包会和 godep 指定的产生相当大的差异,所以请务必不要这样做。 使用 go build -mod=vendor 来构建项目,因为在 go modules 模式下 go build 是屏蔽 vendor 机制的,所以需要特定参数重新开启 vendor 机制:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go build -mod=vendor

构建成功。当发布时也只需要和使用 godep 一样将 vendor 目录带上即可

依赖包的版本管理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
:gin-gonic baxiang$ tree  -L 1
.
├── gin@v0.0.0-20190328061400-ce20f107f5dc
├── gin@v1.1.4
└── gin@v1.3.0

3 directories, 0 files

在上一个问题里,可以看到最终下载在$GOPATH/pkg/mod 下的github.com/gin-gonic 的gin包@ vx.x.x,代表着不同的version,$GOPATH/pkg/mod里可以保存相同包的不同版本。

版本是在go.mod中指定的。

如果,在go.mod中没有指定,go命令会自动下载代码中的依赖的最新版本,本例就是自动下载最新的版本。

如果,在go.mod用require语句指定包和版本 ,go命令会根据指定的路径和版本下载包, 指定版本时可以用latest,这样它会自动下载指定包的最新版本;如果包的作者还没有标记版本,默认为 v0.0.0

go get 命令

新版 go get 可以在末尾加 @ 符号,用来指定版本。 它要求仓库必须用 v1.2.0 格式打 tag,像 v1.2 少个零都不行的,必须是语义化的、带 v 前缀的版本号。其中latest 匹配最新的 tag。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go get github.com/gorilla/mux    # 匹配最新的一个 tag
go get github.com/gorilla/mux@latest    # 和上面一样
go get github.com/gorilla/mux@v1.6.2    # 匹配 v1.6.2
go get github.com/gorilla/mux@e3702bed2 # 匹配 v1.6.2
go get github.com/gorilla/mux@c856192   # 匹配 c85619274f5d
go get github.com/gorilla/mux@master    # 匹配 master 分支
replace

golang.org/x/… 等包在中国大陆区域无法下载 依赖包地址变更 在go.mod文件里用 replace 替换包地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
replace (
    golang.org/x/text => github.com/golang/text latest
    golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)

go mod会用 github.com/golang/text 替代golang.org/x/text,原理就是下载github.com/golang/text 的最新版本到 $GOPATH/pkg/mod/golang.org/x/text下。

goproxy.io

goproxy.io Github 可以给go modules 设置全局代理,下载golang/x的包文件 也就就不需要设置replace Linux 和mac OS

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export GOPROXY=https://goproxy.io

powershell (windows)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$env:GOPROXY = "https://goproxy.io"
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.03.30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Golang Module的使用 顶
注意:go mod 还有一些其他比较有意思的工具,比如可以打印依赖树,比如可以查看哪些模块在哪些包引用了
BGBiao
2019/09/09
1.3K0
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
使用 Go Modules 管理依赖
Go Modules 是 Go 语言的一种依赖管理方式,该 feature 是在 Go 1.11 版本中出现的,由于最近在做的项目中,团队都开始使用 go module 来替代以前的 Godep,Kubernetes 也从 v1.15 开始采用 go module 来进行包管理,所以有必要了解一下 go module。go module 相比于原来的 Godep,go module 在打包、编译等多个环节上有着明显的速度优势,并且能够在任意操作系统上方便的复现依赖包,更重要的是 go module 本身的设计使得自身被其他项目引用变得更加容易,这也是 Kubernetes 项目向框架化演进的又一个重要体现。
田飞雨
2019/12/20
1K0
Go编程之相关命令工具记录
该命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装,整个过程类似安装App一样;
全栈工程师修炼指南
2022/09/29
6280
Go依赖模块版本之Module避坑使用详解
对于Go的版本管理主要用过 glide,下面介绍 Go 1.11 之后官方支持的版本管理工具 mod。
sunsky
2020/08/20
4.6K0
Go mod包依赖管理工具使用详解
对比上面几点: 目前做的最好的也就 maven了,gradle没有使用过,不知道。
OwenZhang
2021/12/08
1K0
Go mod包依赖管理工具使用详解
go mod与 govendor 区别与使用
这句话的意思是:把 go mod init 后下载的相关依 赖包(Gopath 的 pkg) 目录,拷贝到 vendor 目录。
王小明_HIT
2021/07/05
1.5K0
Go语言学习(十)| module 使用
go module 是在go 1.11版本才开始有的,需要将环境变量 GO111MODULE 设置为 on 才能正常使用
Mervyn
2020/07/21
3910
go modules:使用 mod 管理项目依赖包,通过vendor实现一键分发编译包
在go语言1.11版本之前,没有modules机制,所有软件包都在安装在$GOPATH/src目录下。不同项目如果引用了同一个软件包的不同版本,就会造成编译麻烦。修改$GOPATH变量是当时一种比较简单的解决方案。
LIYI
2020/03/25
6.6K0
Go语言基本环境变量与依赖管理
最近开始系统学习一下Golang这么新语言,记录一下它的基本环境变量配置以及依赖管理方式。编写本文的时候使用的Golang版本为go1.13.5 windows/amd64,其他版本不一定保证适合本文的内容。因为习惯,可能有时候把Go语言称为Go,有时候称为Golang。
Throwable
2020/06/23
9.3K1
Go Modules 详解
Go 1.11 和 Go 1.12 包含了初步的 Go Modules 支持,且计划在 2019 年 8 月发布的 Go 1.13 会在所有开发过程中默认使用 Go Modules。
码农编程进阶笔记
2021/07/20
8730
Go Modules 详解
【One by one系列】一步步学习Golang web框架Gin
cd $gopath\src\github.com\carfield\Webapi
DDGarfield
2022/06/23
2430
Go 编程 | 连载 21 - Go Modules 和 Package
GOPATH 是 Go 语言中使用的一个环境变量,它使用绝对路径提供项目的共工作目录,GOPATH 适合处理大量 Go 语言源码、多个包组合而成的复杂工程。
RiemannHypothesis
2022/09/28
5200
Golang官方依赖管理工具dep学习使用笔记
今天在看一个内部项目的时候发现内部一个项目的体积非常大,一看原来是vendor占了很大空间。里面的库都是静态提交到git库的,更新和管理都很不方便,想想java开发中的maven多好用啊。之前也知道golang一直在开发类似的东西,借这个机会了解了一下,golang也已经有了这样的工具了:godep。所以赶紧拿来研究一下看看怎么用起来,用了之后发现,哎,还挺好用的。管理起来非常便捷,不过要吐槽的还是公司的网络环境,好蛋疼啊!
黑光技术
2019/03/06
1.5K0
Golang官方依赖管理工具dep学习使用笔记
层次分明井然有条,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang包管理机制(package)EP10
    Go lang使用包(package)这种概念元素来统筹代码,所有代码功能上的可调用性都定义在包这个级别,如果我们需要调用依赖,那就“导包”就行了,无论是内部的还是外部的,使用import关键字即可。但事情往往没有那么简单,Go lang在包管理机制上走了不少弯路,虽然1.18版本的包管理已经趋于成熟,但前事不忘后事之师,我们还是需要了解一下这段历史。
用户9127725
2022/09/21
2520
go mod使用
最近由于换工作,开始交接工作。整理以前的工作内容,由于组内就我一个在做go和大数据。 所以开发没有规划,当时是怎么快怎么来。go也是使用最传统的go path的方式管理的。都是手动管理依赖的。现在交接给他人,需要多人开发,发现很多问题。比如版本问题,各种依赖的问题等等。
若与
2020/05/18
1.6K0
用go-module作为包管理器搭建go的web服务器
本篇博客主要介绍了如何从零开始,使用Go Module作为依赖管理,基于Gin来一步一步搭建Go的Web服务器。并使用Endless来使服务器平滑重启,使用Swagger来自动生成Api文档。
SH的全栈笔记
2019/10/20
1.7K0
Go依赖管理——Go Mod
module简介 在 go1.12,go发布了官方的包管理工具 Go Module 使用module 生成go.mod 新建一个文件夹作为项目目录,执行 go mod init 模块名称 使用mod初始化项目,生成项目依赖管理文件go.mod 这个文件也可以手动创建,无伤大雅 初始化后的go.mod文件内容如下 module test go 1.14 添加依赖 通过在go.mod中,添加require语句,导入依赖,如 require golang.org/x/text v0.3.0 require g
歪歪梯
2020/10/26
2.1K0
Golang中的包管理工具 - Go Modules
在Go1.5之前使用GOROOT和GOPATH这2个系统环境变量来决定包的位置,对于开发者主要使用GOPATH。GOPATH 解决了第三方源码依赖的问题,看一下我本机 $GOPATH/src 下的目录:
猿哥
2019/08/01
1.6K0
Go项目管理
包被导入时,会执行init函数,优先于main函数,不能有参数和返回值,建议少用,仅用于全局变量初始化,或者单元测试初始化一些东西
用户9022575
2021/10/01
1K0
相关推荐
Golang Module的使用 顶
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档