一、 安装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
排除。这些包将被列为excluded(x)
,并且在运行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 或 分支发布,保持它们是最新的
-
经常检查 "vendor/vendor.json"文件
你可以添加忽略规则 vendor/*/ 来忽略源文件。这样,如果某些东西似乎损坏,那么您的包裹的使用者有机会再现您的包装测试 -
如果你希望外部包导入它,请不要检入 vendor 源
go get 的方式当前的工作是下载仓库到 $GOPATH 而不做修改。这很好,但是如果一个 “library" 仓库包含一个 vendor 文件夹,这看起来它将不可用,除非使用者也 vendor 这些依赖。(猜想这句话的意思是,在你发布程序时,不要带上vendor目录) -
不要为 main 包检入 vendor 源码
可重用构建是非常重要的。仓库可以并确实消失了。拉取它们到你自己的仓库,放到 vendor 文件夹。15年后你的维护人员会感谢你 -
使用 semver 发布,不要主版本的兼容性
使用semver发布:v..[-].
增量主版本: 打破现有的API.
增量副版本:增加API,并不破坏现有的API.
增量补丁: api不变,修复bug.
pre-release 标签: 为以后拥有同样版本号的发布做准备.
govendor 也将处理前缀,例如 ssh-v1.0.2-beta1 可以被govendor中的 govendor fetch my/utils/ssh@ssh-v1使用。
- 如果您选择使用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 .
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