当使用Bazel构建内部依赖项的项目时,Golang构建失败

4

我使用的是MacOS 10.13.2操作系统。 Go版本是1.10。 Bazel版本是0.11.1。

我需要编译一个包含两个项目(project1和project2)的仓库。 project1有两个子包,即p1lib和dep1。 p1lib使用了dep1。

我使用gazelle生成BUILD文件,文件看起来没问题。

gazelle -go_prefix=github.com/BazelBuildForGo

但当我运行构建时,出现了一个错误,说我缺少直接依赖。

bazel build //project1
INFO: Analysed target //project1:project1 (3 packages loaded).
INFO: Found 1 target...
ERROR: /private/var/tmp/_bazel_user1/df78026a5ee0c7ed3d23dd05c3a3b1f7/external/com_github_wix_private_bazelbuildforgo/project1/p1lib/BUILD.bazel:3:1: GoCompile external/com_github_wix_private_bazelbuildforgo/project1/p1lib/darwin_amd64_stripped/go_default_library~/github.com/BazelBuildForGo/project1/p1lib.a failed (Exit 1)
2018/03/25 18:02:55 missing strict dependencies:
    external/com_github_wix_private_bazelbuildforgo/project1/p1lib/p1lib.go: import of github.com/wix-private/BazelBuildForGo/project1/dep1, which is not a direct dependency
Target //project1:project1 failed to build
Use --verbose_failures to see the command lines of failed build steps.
INFO: Elapsed time: 0.358s, Critical Path: 0.12s
FAILED: Build did NOT complete successfully

我的项目可以在这里找到:https://github.com/wix-playground/BazelBuildForGo

1个回答

2
我认为问题在于你在命令行中传递给 Gazelle 的导入前缀 (github.com/BazelBuildForGo) 与 .go 文件中的导入 (github.com/wix-private/BazelBuildForGo) 不同。当 Gazelle 发现超出当前前缀的导入时,它将为这些导入生成外部依赖项,而这些依赖项将会丢失。
go_library(
    name = "go_default_library",
    srcs = ["p1lib.go"],
    importpath = "github.com/BazelBuildForGo/project1/p1lib",
    visibility = ["//visibility:public"],
    deps = ["@com_github_wix_private_bazelbuildforgo//project1/dep1:go_default_library"],
)

这个问题的解决方法非常简单。只需在Gazelle前加上前缀github.com/wix-private/BazelBuildForGo。实际上,你已经在//:gazelle中拥有了它,所以只需要运行它,然后重新构建即可。
$ bazel run //:gazelle
$ bazel build //...

这将会把上面的 go_library 规则更改为以下形式:

go_library(
    name = "go_default_library",
    srcs = ["p1lib.go"],
    importpath = "github.com/wix-private/BazelBuildForGo/project1/p1lib",
    visibility = ["//visibility:public"],
    deps = ["//project1/dep1:go_default_library"],
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接