2

到目前为止,我一直在使用go工具来获取依赖项。我已经设置$GOPATH~/projects/holygrail,并且我已经将我的代码签入到src/mycodehosting.foo/myuser/holygrail.

鉴于我实际上依赖于诸如 gRPC 之类的东西,这意味着我需要protoc从 protobuf v3 的源代码构建,所以我编写了一个小脚本来帮助我做到这一点。当我检查我的源代码时,我强烈希望不必预先准备布局,并且我强烈希望使用 bash 脚本来获取我的依赖项,然后构建它们。

目前的暂定解决方案:

  • 使用 Git 子模块来获取外部依赖项(遗憾的是,这意味着没有go get知道如何做的智能重定向)
  • GO15VENDOREXPERIMENT通过将变量翻转为 1 来使用 Go 1.5 的 vendoring
  • 切换到 Bazel 以拥有一个健全的构建系统,该系统将知道如何仅根据需要构建各种依赖项

不幸的是,我有点卡住了。

  • 我正在使用 Bazel 0.1.1 和 Skylark 规则从 git repo 复制到~/.bazel/base_workspace
  • 我最初尝试在 Bazel's中使用new_local_repository(后来被切换到使用),为其中一个依赖项指定自定义文件 new_git_repositoryWORKSPACEBUILD
    • 这失败了,因为 Bazel 无法找到 Go Skylark 规则
  • 我不确定如何为文件夹中的下载存储库编写自定义BUILD文件git-submodulevendor/并将它们公开给 Bazel。

我在正确的轨道上吗?我使用子模块是否正确?我是否正确使用vendor/子文件夹来存储 Go 库?

  • 使用 Bazel 构建外部依赖项的推荐方法是什么,其中代码和依赖项都是用 Go 编写的?
  • 您能否提供一个存储库示例:
    • 正确地依赖于外部BUILD无文件 Go 存储库(没有实际导入上游代码)?
    • 在外部存储库中正确构建 Go 代码?
    • 将外部存储库中的 Go 代码正确集成到 Go 主项目中?

对此进行更多研究:

  • Kythe 似乎BUILD为许多依赖项提供了一个文件(即使它们不是子模块,也没有什么区别)。
  • 该辅助规则使用该go_package()规则。但这似乎来自Kythe本身
    • 从 Kythe 开始使用规则似乎并不正确,但这似乎是一种可行的方法?
    • 其他人做什么?
4

1 回答 1

0

在几个版本之前,Bazel 支持规则名称中的斜线。除了对自定义包名称( https://github.com/bazelbuild/rules_go/issues/16 )的入侵支持外,这似乎涵盖了我的用例。

tl;博士我有//vendor:BUILD文件,其中包含诸如go_library(name='github.com/blah/blah', ...). 目录被命名,例如,//vendor/github.com/blah/blah。每个子包都有一个单独的规则。我已经手动指定了依赖项。

于 2016-06-15T18:07:53.097 回答