当前位置: 首页 > 工具软件 > Govendor > 使用案例 >

Golang包管理工具 - govendor

邹英光
2023-12-01

一、 安装govendor

go get -u github.com/kardianos/govendor
  • 使用 govendor add/update 从$GOPATH 目录拷贝已经存在的依赖
  • 如果忽略 vendor/*/,使用 govendor sync 命令存储依赖(拷贝 vendor/ 下的依赖到 $GOPATH/src下)
  • 使用 govendor fetch 拉取新的依赖或直接从远程更新已经存在的依赖
  • 使用 govendor migrate 从之前的系统中迁移
  • 支持 Linux,OS X,Windows,可能还有其他所有的
  • 支持 git,hg,svn,bzr(这些必须已经被安装并在PATH中)

二、 命令使用

# 进行您的项目.
cd "my project in GOPATH"
govendor init

# 添加 GOPATH 中已存在的文件到 vendor.
govendor add +external

# 列出项目依赖列表.
govendor list

# 查看一个包在哪些地方被使用
govendor list -v fmt

# 指定要获取的特定版本或修订版本
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 fetch golang.org/x/net/context

# 仅仅格式化您自己的仓库
govendor fmt +local

# 仅构建你仓库中的任何内容
govendor install +local

# 仅仅测试你自己的仓库
govendor test +local

三、 子命令

	init     创建 "vendor" 文件夹和 "vendor.json"文件.
	list     列出并过滤现有的依赖和包.
	add      从 $GOPATH 添加包.
	update   从 $GOPATH 更新包.
	remove   从 vendor 文件夹中删除包.
	status   列出所有本地丢失,过期或修改的包.
	fetch    从远端仓库中增加或更新 vendor 文件中依赖的包.
	sync     使用vendor.json文件中的修订将包从远程存储库中提取到vendor文件夹中.
	migrate  使用元数据将包从旧工具移动到供应商文件夹。.
	get      和 "go get" 一样,但是是拷贝依赖项到 "vendor" 文件夹.
	license  列出已发现的给定状态或导入路径的许可证.
	shell    对于大项目,运行一个 "shell" 使多个子命令更有效率.
	go 工具命令被封装:
	  `+<status>` 包选择可以和他们一起使用fmt, build, install, clean, test, vet, generate, tool

四、状态

包可以通过 “status” 被指定

	+local    (l) 你项目中的包,本地包
	+external (e) 在 GOPATH中被引用的但并不在当前项目的包
	+vendor   (v) 在 vendor 文件夹中的包
	+std      (s) 在标准库中的包

	+excluded (x) 明确地从 vendoring中被排队的外部包
	+unused   (u) 在 vendor 文件夹中但并未使用的包
	+missing  (m) 引用但并未找到的包

	+program  (p) 在 main 中的包

	+outside  +external 外部的包和缺失的包
	+all      +all 所有的包

状态可以通过它们的初始字母被引用

  • +std+s 一样
  • +external+ext+e 一样
  • +excluded+exc+x 一样

状态可以被逻辑组合

  • +local, program (local AND program) 本地包同时也是主程序包
  • +local +vendor(local OR vendor)本地包或vendor包
  • +vendor,program +std ((vendor AND program) OR std) vendor包同样也是程序包或标准包
  • +vendor,^program (vendor AND NOT program) vendor包但并不是 "main"包

五、包说明符

完整的包指定是:<path>[{/...|/^}][::<origin>][@[<version-spec>]]
一样例子:

  • github.com/kardianos/govendor 指定一个单个包和单个文件夹。
  • github.com/kardianos/govendor/... 指定 govendor 和所有在这个路径的引用包。
  • github.com/kardianos/govendor/^ 指定govendor文件夹和所有的子文件夹,对于资源或你不想要部分仓库很有用。
  • github.com/kardianos/govendor/^::github.com/myself/govendor 和上面的一样但是是从用户本身获取。
  • github.com/kardianos/govendor/...@abc12032 修订号abc12032下所有的包引用。
  • github.com/kardianos/govendor/...@v1 和上面一样,但是获取的是最新的 “v1", 例如 ”v1.4.3"。
  • github.com/kardianos/govendor/...@=v1 获取精确的版本 “v1”。

六、包和状态

你或许在单个命令中指定多个包指定和多个状态,接受状态和包指定的命令:

  • list
  • add
  • update
  • remove
  • fetch
    如果最后一个参数是“ - ”,你可以通过stdin将参数传递给govendor。例如echo + vendor | govendor list -将列出所有vendor包

七、忽略构建标记并排除包

忽略构建标记是选择退出的,并且被设计为与指定时选择加入的构建文件指令相反。通常,开发人员希望支持跨平台构建,但根据需要有选择地选择退出代码,进行测试和架构。
为了忽略额外的 tags ,编辑 “vendor.json" 文件并添加 tag 到vendor 文件的 ”ignore" 字段。该字段使用空格区分忽略的 tag,例如下面的 test 和 appengine 文件都被忽略

{
	"ignore": "test appengine",
}

同样,某些特定的包可以从 vendoring 排除。这些包将被列为excludedx),并且在运行govendor add | fetch | update时不会被复制到“vendor”文件夹。

排除包 foo 的任何子包 foo/bar 也被排除(但是包 bar/foo 不是)。排除的包的导入依赖性未列出,因此不会被 vendored。

要排除包,同样要使用“vendor.json”文件的“ignore”字段。包由其名称标识,它们应包含“/”字符(可能在末尾):

{
	"ignore": "test appengine foo/",
}

八、开发指南

  • 经常检入 "vendor/vendor.json" 文件
  • 如果你希望外部包导入它,请不要检入 vendor 源代码
  • 为主程序包检入 vendor 源文件
  • Main包应该提供它们自己的公共依赖
  • 使用 semver 发步,不要破坏主版本的兼容性
  • 如果你选择使用 tags 或 分支发布,保持它们是最新的

1. 经常检查 "vendor/vendor.json"文件

你可以添加忽略规则 vendor/*/ 来忽略源文件。这样,如果某些东西似乎损坏,那么您的包裹的使用者有机会再现您的包装测试

2. 如果你希望外部包导入它,请不要检入 vendor 源

go get 的方式当前的工作是下载仓库到 $GOPATH 而不做修改。这很好,但是如果一个 “library" 仓库包含一个 vendor 文件夹,这看起来它将不可用,除非使用者也 vendor 这些依赖。(猜想这句话的意思是,在你发布程序时,不要带上vendor目录)

3. 不要为 main 包检入 vendor 源码

可重用构建是非常重要的。仓库可以并确实消失了。拉取它们到你自己的仓库,放到 vendor 文件夹。15年后你的维护人员会感谢你

4. 使用 semver 发布,不要主版本的兼容性

使用semver发布:v<major>.<minor>.<patch>[-<pre-release>].

  • 增量主版本: 打破现有的API.
  • 增量副版本:增加API,并不破坏现有的API.
  • 增量补丁: api不变,修复bug.
  • pre-release 标签: 为以后拥有同样版本号的发布做准备.

govendor 也将处理前缀,例如 ssh-v1.0.2-beta1 可以被govendor中的 govendor fetch my/utils/ssh@ssh-v1使用。

5. 如果您选择使用tag或branches进行发布,请将它们保持最新状态

在分支中工作是完全合理的,然后在分支稳定时仅将分支合并到主分支。这有效地释放了软件。
如果您还选择标记修订或发布到专用分支(如名为“v1”的分支),请确保HEAD永远不会在发布之前走得太远。如果它这样做,它会使版本过时并停止使用

九、govendor 常见问题

Q: 如何只测试我自己的包?
A: 运行 govendor test +local

Q: 如何构建安装我所有的 vendor 包?
A: 运行 govendor install +vendor,^program

Q: 如何远端网络上拉取所有的依赖?
A: 运行 govendor fetch +out

Q: 我有一个工作项目,依赖在$GOPATH目录,我希望它在vendor下。
A: 运行 govendor add +external

Q: 我已经拷贝依赖到 “vendor"目录,我想要从 $GOPATH 目录更新。
A: 运行 govendor update +vendor

Q: 我在 appengine 中丢失了包但是我并不关心 appengine。我如何忽略这些包?
A: 编辑 vendor/vendor.json 文件,更新 “ignore” 字段包含 ”appengine".如果你已经忽略 tests, 它将会是 :"ignore":"test appengine"

Q: 我已经修改位于$GOPATH中的包,我想在 vendor中测试改变但不提交它。
A: 运行 govendor update -uncommitted <updated-package-import-path>.

Q: 我 forked 一个包但我目前仍未升级它,我该怎么办?
A: 假设你已经推送你的修改到一个可访问的仓库,运行govendor fetch github.com/normal/pkg::github.com/myfork/pkg。这将从 ”myfork"获取并将包放在 “normal"中

Q: 子文件夹中有 C 文件或 HTML 资源文件,我如何确保它们也已被拷贝?
A: 运行govendor fetch github.com/dep/pkg/^govendor add github.com/dep/pkg/^使用 -tree 参数效果一样

Q: 如何阻止 vendor中源文件被检入?
A: 在你的忽略文件中添加 vendor/*/

Q: 如果 vendor 文件夹尚未检入,如何填充它?
A: 运行 govendor sync

 类似资料: