Go和Bazel:使用外部Git存储库

时间:2015-12-02 23:28:27

标签: git go bazel

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

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

目前的暂定解决方案:

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

不幸的是,我稍微卡住了。

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

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

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

对此进行了更多研究:

  • Kythe似乎有一个BUILD文件用于许多依赖项(即使它们不是子模块,这没有什么区别)。
  • 该帮助程序规则使用go_package()规则。但这似乎来了from Kythe itself
    • 从Kythe开始使用规则似乎不对,但这似乎是一种可行的方法吗?
    • 其他人做什么?

1 个答案:

答案 0 :(得分:0)

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

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