govendor介绍

govendor 是 GoLang 常用的一个第三方包管理工具,它的出现解决了不同用户在 clone 同一个项目时从外部获取不同依赖库版本的问题。

govendor会将项目需要的依赖包添加到项目的 vendor 目录下,并且该目录中 vendor.json 文件会保存添加的依赖包的路径等信息。

Golang 项目中的go文件在查找依赖的顺序是,先在当前包下的 vendor 目录中查找,vendor 没找到,然后在 GOPATH 中查找,都没找到最后在 GOROOT 中查找。

govendor只是用来管理项目的依赖包,如果 GOPATH 中本身没有项目的依赖包,则需要通过go get先下载到 GOPATH 中,再通过govendor add +external拷贝到 vendor 目录中。

从 GoLang 1.11 版本开始,官方推出了一个崭新的包管理工具 — go module,随着 GoLang 1.13 版本的发布,go module 默认开启,官方开始强推 go module,使用 go module 作为包管理工具已经成为了官方倡导的趋势。

go module基本使用

安装与使用

govendor安装

在使用Govendor之前,需要安装Govendor

go get -u github.com/kardianos/govendor

从 Go 1.17 版本开始,'go get' 命令在安装可执行文件方面已经被弃用。

应该使用 'go install' 命令来安装可执行文件。

go install github.com/kardianos/govendor@latest

为了便于项目使用Govendor。建议将 $GOPATH/bin 添加到 PATH 中。

export PATH="$GOPATH/bin:$PATH"

govendor使用

在使用govendor时,当前项目需要在$GOPATH路径下,并且Go版本>=1.5,需要设置GO15VENDOREXPERIMENT=1

在 Golang1.5 版本后,Go 提供了 GO15VENDOREXPERIMENT 环境变量,并从 GoLang1.6 版本开始默认开启该环境变量。

一旦开启 GO15VENDOREXPERIMENTgo build 等工具除了搜索 $GOPATH/src 路径外,还会搜索当前项目的 vendor 路径,govendor 正是利用了这一特性来实现的。

export GO15VENDOREXPERIMENT=1

1 . govendor初始化(同时创建 vendor 文件夹和 vendor.json 文件)

govendor init

2 . 从 $GOPATH 中复制依赖包到 vendor 目录

govendor add +external

如果你只想添加某个包,执行:

govendor fetch github.com/tjfoc/gmsm/

3 . 从$GOPATH目录下添加依赖包,依赖包会加到 vendor.json

govendor add github.com/tjfoc/gmsm/

4 . 从远程仓库添加包并下载到$GOPATH目录

govendor get github.com/tjfoc/gmsm/

5 . 基于vendor.json 中记录的依赖包信息,拉取更新

govendor sync

6 . 列出代码引用的包及状态

govendor list

7 . 找出使用的对应包

govendor list -v fmt

8 . 从远程仓库添加或更新拉取指定版本的包

govendor fetch golang.org/x/net/context

govendor fetch golang.org/x/net/context@a4bbce9fcae005b22ae5443f6af064d80a6f5a55
govendor fetch golang.org/x/net/context@v1 # Get latest v1.*.* tag or branch.
govendor fetch golang.org/x/net/context@=v1 # Get the tag or branch named "v1".

常见的命令

格式为 govendor COMMAND

命令 功能
init 初始化 vendor 目录
list 列出所有的依赖包
add 添加包到 vendor 目录,如 govendor add +external 添加所有外部包
add PKG_PATH 添加指定的依赖包到 vendor 目录
update 从 $GOPATH 更新依赖包到 vendor 目录
remove 从 vendor 管理中删除依赖
status 列出所有缺失、过期和修改过的包
fetch 添加或更新包到本地 vendor 目录
sync 本地存在 vendor.json 时候拉去依赖包,匹配所记录的版本
get 类似 go get 目录,拉取依赖包到 vendor 目录

go vendor –help查看子命令

Sub-Commands

    init     Create the "vendor" folder and the "vendor.json" file.
list List and filter existing dependencies and packages.
add Add packages from $GOPATH.
update Update packages from $GOPATH.
remove Remove packages from the vendor folder.
status Lists any packages missing, out-of-date, or modified locally.
fetch Add new or update vendor folder packages from remote repository.
sync Pull packages into vendor folder from remote repository with revisions
from vendor.json file.
migrate Move packages from a legacy tool to the vendor folder with metadata.
get Like "go get" but copies dependencies into a "vendor" folder.
license List discovered licenses for the given status or import paths.
shell Run a "shell" to make multiple sub-commands more efficient for large
projects.

govendor命令参数

Status Types

    +local    (l) packages in your project
+external (e) referenced packages in GOPATH but not in current project
+vendor (v) packages in the vendor folder
+std (s) packages in the standard library +excluded (x) external packages explicitly excluded from vendoring
+unused (u) packages in the vendor folder, but unused
+missing (m) referenced packages but not found +program (p) package is a main package +outside +external +missing
+all +all packages

注意事项

  • 如果引用包目录下不存在go文件,使用fetch、get等命令会报错

  • 如果$GOPATH目录下存在引用包,使用fetch命令会出现无法下载包的情况

go包管理工具 govendor的更多相关文章

  1. Go 包依赖管理工具 —— govendor

    govendor 是一个基于 vendor 机制实现的 Go 包依赖管理命令行工具.与原生 vendor 无侵入性融合,也支持从其他依赖管理工具迁移,可以很方便的实现同一个包在不同项目中不同版本.以及 ...

  2. Golang学习--包管理工具glide

    上一篇文章中我们已经成功的运行了go的代码,这是我们迈出的最基础的一步. 一个项目通常会依赖很多外部的库,当依赖的库比较多的时候,手工管理就会比较麻烦,这个时候就需要包管理工具出场了,帮你管理好所有依 ...

  3. Go包管理工具Vendor使用

    一.Go包管理工具Vendor 一.使用步骤 1.首先,从go get -u github.com/kardianos/govendor下载govendor工具到本地. 2.govendor使用时,必 ...

  4. Golang包管理工具glide简介

    Golang包管理工具glide简介 前言 Golang是一个十分有趣,简洁而有力的开发语言,用来开发并发/并行程序是一件很愉快的事情.在这里我感受到了其中一些好处: 没有少了许多代码格式风格的争论, ...

  5. golang包管理工具及环境管理工具;如何下载外网的依赖包

    简介: golang的包管理工具类似于java的maven.python的pip.js的npm,可以实现依赖包的统一管理:有很多:govendor.godep.glide,挑一个自己喜欢的用吧.mac ...

  6. go包管理工具glide使用方法

    golang没有官方最佳管理方案,在go的世界里存在大量的自制解决方案. go语言的包是没有中央库统一管理的,通过使用go get命令从远程代码库(github.com,goolge code 等)拉 ...

  7. golang包管理工具

    软件开发中,不可避免的会使用到第三方库,因此包管理工具可以极大的方便开发者管理第三方依赖,避免掉入"依赖地狱". 作为google强大背书的golang语言,golang官方包管理 ...

  8. glide包管理工具

    上一篇文章中我们已经成功的运行了go的代码,这是我们迈出的最基础的一步. 一个项目通常会依赖很多外部的库,当依赖的库比较多的时候,手工管理就会比较麻烦,这个时候就需要包管理工具出场了,帮你管理好所有依 ...

  9. Go的包管理工具(一)

    在前面转载了系列文章:Golang 需要避免踩的 50 个坑,总得来说阅读量都挺大.今天这篇文章,咱们一起聊聊Go的依赖包管理工具. 背景 每一门语言都有其依赖的生态,当我们使用Java语言的时候,使 ...

  10. go依赖包管理工具vendor基础

    go依赖包管理工具vendor基础 vendor是go的依赖包管理工具,主要用于管理项目中使用到的一些依赖. 它将项目依赖的包,特指外部包,复制到当前工程下的vendor目录下,这样go build的 ...

随机推荐

  1. Qt数据库应用18-横向纵向排版

    一.前言 近期用户提了个需求,需要打印一个文档,要求其中部分页横向排版部分页面纵向排版,这个在之前的通用打印导出pdf类中是不具备的,通用的打印导出pdf只能统一设置一个排版方式,要么横向要么纵向,而 ...

  2. ESLint is disabled since its execution has not been approved or denied yet

    VS Code 装好ESLint 插件报黄线的问题,具体解决方法如下所示: ESLint is disabled since its execution has not been approved o ...

  3. 在Android Studio中如何使用真机连接并调试App?

    前提:adb环境已经配置 手机端: 1.打开手机开发者权限,"设置" 中找到 "版本号",连续多次点击,会提示打开"开发者".我的是 &qu ...

  4. 修改led-core.c 让led的delay_on和delay_off时间不会应为trigger配置改版而重置为1HZ

    先列一下leds trigger的设置流程 echo none > trigger 的流程 led_trigger_set() | led_stop_software_blink() echo ...

  5. 【Java RPC】使用netty手写一个RPC框架 结合新特性 虚拟线程

    [手写RPC框架]如何使用netty手写一个RPC框架 结合新特性 虚拟线程 什么是RPC框架 RPC(Remote Procedure Call)远程过程调用,是一种通过网络从远程计算机程序上请求服 ...

  6. 让 LLM 来评判 | 选择 LLM 评估模型

    基础概念 这是 让 LLM 来评判 系列文章的第一篇,敬请关注系列文章: 基础概念 选择 LLM 评估模型 设计你自己的评估 prompt 评估你的评估结果 奖励模型相关内容 技巧与提示 什么是评估模 ...

  7. 十四款常见的Web前端开发框架

    在做web开发的时候经常会遇到一个问题,那就是,选择什么样的框架来做前端开发.下面封程中把目前常用的一些前端的框架简单的给大家介绍一下. 1. BootstrapBoostrap绝对是目前最流行用得最 ...

  8. 安装Docker及相关容器

    一,Docker简介百科说:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱 ...

  9. STL 容器操作

    vector set转化为vector:vec.assign(set.begin(), set.end()) map 1. map默认从小到达排序,想要从大到小,可以: map<string, ...

  10. K8s 灰度发布实战:通过 Ingress 注解轻松实现流量分割与渐进式发布

    在现代微服务架构中,应用的更新和发布是一个高频且关键的操作.如何在不影响用户体验的前提下,安全.平稳地将新版本应用推送到生产环境,是每个开发者和运维团队必须面对的挑战.灰度发布(Gray Releas ...