go get -u github.com/kardianos/govendor
govendor add/update
从$GOPATH 目录拷贝已经存在的依赖vendor/*/
,使用 govendor sync
命令存储依赖(拷贝 vendor/ 下的依赖到 $GOPATH/src下)govendor fetch
拉取新的依赖或直接从远程更新已经存在的依赖govendor migrate
从之前的系统中迁移# 进行您的项目.
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”。你或许在单个命令中指定多个包指定和多个状态,接受状态和包指定的命令:
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/*/
来忽略源文件。这样,如果某些东西似乎损坏,那么您的包裹的使用者有机会再现您的包装测试
go get
的方式当前的工作是下载仓库到 $GOPATH 而不做修改。这很好,但是如果一个 “library" 仓库包含一个 vendor 文件夹,这看起来它将不可用,除非使用者也 vendor 这些依赖。(猜想这句话的意思是,在你发布程序时,不要带上vendor目录)
可重用构建是非常重要的。仓库可以并确实消失了。拉取它们到你自己的仓库,放到 vendor 文件夹。15年后你的维护人员会感谢你
使用semver发布:v<major>.<minor>.<patch>[-<pre-release>]
.
govendor
也将处理前缀,例如 ssh-v1.0.2-beta1
可以被govendor中的 govendor fetch my/utils/ssh@ssh-v1
使用。
在分支中工作是完全合理的,然后在分支稳定时仅将分支合并到主分支。这有效地释放了软件。
如果您还选择标记修订或发布到专用分支(如名为“v1”的分支),请确保HEAD永远不会在发布之前走得太远。如果它这样做,它会使版本过时并停止使用
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