使用Bazel拉GitHub存储库

Jur*_*rza 2 github bazel

我需要使用Bazel下载整个GitHub存储库。因为我对这个工具还很陌生,所以我不确定如何实现。

我的主要想法是:

downloadgithubrepo.bzl(与WORKSPACE文件一样位于项目根目录)中编写自定义存储库规则,例如:

def _impl(repository_ctx):
    repository_ctx.download("url_to_zipped_github_repo", output='relative_path_to_output_file')

github = repository_rule(
    implementation = _impl
Run Code Online (Sandbox Code Playgroud)

并在WORKSPACE文件中编写如下内容:

load("//:downloadgithubrepo.bzl", "github")
Run Code Online (Sandbox Code Playgroud)

并需要一个BUILD文件(也位于项目根目录)来调用构建,其内容如下:

cc_library(
    name = "testrun",
    srcs = "main.c",
)
Run Code Online (Sandbox Code Playgroud)

我必须添加main.c文件,否则构建会失败-这是一个问题,真正的问题是这不起作用,因为构建正在传递中,但是GitHub存储库未下载。

我完全走对了吗?有人做过这样的事吗?

Jin*_*Jin 5

What you're looking might already be implemented in the new_git_repository repository rule, or the git_repository rule if the GitHub project already has Bazel BUILD files wired in.

If the GitHub project does not have BUILD files, a BUILD file is required when using new_git_repository. For example, if you want to depend on a file target (e.g. /foo/bar.txt) or rule target (e.g. a cc_library) in https://github.com/example/repository, and the repository does not have BUILD files, write these lines in your project's WORKSPACE file:

new_git_repository(
    name = "example_repository",
    remote = "https://github.com/example/repository.git",
    build_file_content = """
exports_files(["foo/bar.txt"])

# you can also create targets
cc_library(
    name = "remote_cc_library",
    srcs = ["..."],
    hdrs = ["..."],
""",
)
Run Code Online (Sandbox Code Playgroud)

In your BUILD file, reference the external repository's targets using the @ prefix:

cc_library(
    name = "testrun",
    srcs = ["main.c"],
    data = ["@example_repository//:foo/bar.txt"],
    deps = ["@example_repository//:remote_cc_library"],
)
Run Code Online (Sandbox Code Playgroud)

When you run bazel build //:testrun, Bazel will..

  1. Analyze the dependencies of //:testrun, which include the file main.c and targets from the external repository @example_repository.
  2. Look up the WORKSPACE file for an external repository named example_repository, and finds the new_git_repository declaration.
  3. Perform a git clone on the remote attribute specified in the example_repository declaration.
  4. Write a BUILD file containing the build_file_content string at the project root of the cloned repository.
  5. Analyze the targets @example_repository//:foo/bar.txt and @example_repository//:remote_cc_library
  6. Build the dependencies, and hands them to your //:testrun cc_library.
  7. Build //:testrun.

If the GitHub project does have BUILD files, you do not need to provide an BUILD file. You can refer to the targets directly after specifying the WORKSPACE dependency with git_repository:

git_repository(
    name = "example_repository",
    remote = "https://github.com/example/repository.git",
)
Run Code Online (Sandbox Code Playgroud)

For more information, check out Bazel's documentation on External Repositories.