| Repository rules |
| ================ |
| |
| .. _http_archive.strip_prefix: https://docs.bazel.build/versions/master/be/workspace.html#http_archive.strip_prefix |
| .. _native git_repository rule: https://docs.bazel.build/versions/master/be/workspace.html#git_repository |
| .. _native http_archive rule: https://docs.bazel.build/versions/master/be/workspace.html#http_archive |
| .. _manifest.bzl: third_party/manifest.bzl |
| .. _Directives: /README.rst#directives |
| .. _`@bazel_tools//tools/build_defs/repo:git.bzl`: https://github.com/bazelbuild/bazel/blob/master/tools/build_defs/repo/git.bzl |
| .. _`@bazel_tools//tools/build_defs/repo:http.bzl`: https://github.com/bazelbuild/bazel/blob/master/tools/build_defs/repo/http.bzl |
| |
| .. role:: param(kbd) |
| .. role:: type(emphasis) |
| .. role:: value(code) |
| .. |mandatory| replace:: **mandatory value** |
| |
| Repository rules are Bazel rules that can be used in WORKSPACE files to import |
| projects in external repositories. Repository rules may download projects |
| and transform them by applying patches or generating build files. |
| |
| The Gazelle repository provides three rules: |
| |
| * `go_repository`_ downloads a Go project using either ``go mod download``, a |
| version control tool like ``git``, or a direct HTTP download. It understands |
| Go import path redirection. If build files are not already present, it can |
| generate them with Gazelle. |
| * `git_repository`_ downloads a project with git. Unlike the native |
| ``git_repository``, this rule allows you to specify an "overlay": a set of |
| files to be copied into the downloaded project. This may be used to add |
| pre-generated build files to a project that doesn't have them. |
| * `http_archive`_ downloads a project via HTTP. It also lets you specify |
| overlay files. |
| |
| **NOTE:** ``git_repository`` and ``http_archive`` are deprecated in favor of the |
| rules of the same name in `@bazel_tools//tools/build_defs/repo:git.bzl`_ and |
| `@bazel_tools//tools/build_defs/repo:http.bzl`_. |
| |
| Repository rules can be loaded and used in WORKSPACE like this: |
| |
| .. code:: bzl |
| |
| load("@bazel_gazelle//:deps.bzl", "go_repository") |
| |
| go_repository( |
| name = "com_github_pkg_errors", |
| commit = "816c9085562cd7ee03e7f8188a1cfd942858cded", |
| importpath = "github.com/pkg/errors", |
| ) |
| |
| Gazelle can add and update some of these rules automatically using the |
| ``update-repos`` command. For example, the rule above can be added with: |
| |
| .. code:: |
| |
| $ gazelle update-repos github.com/pkg/errors |
| |
| go_repository |
| ------------- |
| |
| ``go_repository`` downloads a Go project and generates build files with Gazelle |
| if they are not already present. This is the simplest way to depend on |
| external Go projects. |
| |
| When ``go_repository`` is in module mode, it saves downloaded modules in a shared, |
| internal cache within Bazel's cache. It may be cleared with ``bazel clean --expunge``. |
| By setting the environment variable ``GO_REPOSITORY_USE_HOST_CACHE=1``, you can |
| force ``go_repository`` to use the module cache on the host system in the location |
| returned by ``go env GOPATH``. |
| |
| **Example** |
| |
| .. code:: bzl |
| |
| load("@bazel_gazelle//:deps.bzl", "go_repository") |
| |
| # Download using "go mod download" |
| go_repository( |
| name = "com_github_pkg_errors", |
| importpath = "github.com/pkg/errors", |
| sum = "h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=", |
| version = "v0.8.1", |
| ) |
| |
| # Download automatically via git |
| go_repository( |
| name = "com_github_pkg_errors", |
| commit = "816c9085562cd7ee03e7f8188a1cfd942858cded", |
| importpath = "github.com/pkg/errors", |
| ) |
| |
| # Download from git fork |
| go_repository( |
| name = "com_github_pkg_errors", |
| commit = "816c9085562cd7ee03e7f8188a1cfd942858cded", |
| importpath = "github.com/pkg/errors", |
| remote = "https://example.com/fork/github.com/pkg/errors", |
| vcs = "git", |
| ) |
| |
| # Download via HTTP |
| go_repository( |
| name = "com_github_pkg_errors", |
| importpath = "github.com/pkg/errors", |
| urls = ["https://codeload.github.com/pkg/errors/zip/816c9085562cd7ee03e7f8188a1cfd942858cded"], |
| strip_prefix = "errors-816c9085562cd7ee03e7f8188a1cfd942858cded", |
| type = "zip", |
| ) |
| |
| **Attributes** |
| |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | **Name** | **Type** | **Default value** | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`name` | :type:`string` | |mandatory| | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | A unique name for this rule. This should usually be the Java-package-style | |
| | name of the URL, with underscores as separators, for example, | |
| | ``com_github_example_project``. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`importpath` | :type:`string` | |mandatory| | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | The Go import path that matches the root directory of this repository. In | |
| | module mode (when ``version`` is set), this must be the module path. If | |
| | neither ``urls`` nor ``remote`` is specified, ``go_repository`` will | |
| | automatically find the true path of the module, applying import path | |
| | redirection. | |
| | | |
| | If build files are generated for this repository, libraries will have their | |
| | ``importpath`` attributes prefixed with this ``importpath`` string. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`version` | :type:`string` | :value:`""` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | If specified, ``go_repository`` will download the module at this version | |
| | using ``go mod download``. ``sum`` must also be set. ``commit``, ``tag``, | |
| | and ``urls`` may not be set. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`sum` | :type:`string` | :value:`""` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | A hash of the module contents. In module mode, ``go_repository`` will verify | |
| | the downloaded module matches this sum. May only be set when ``version`` | |
| | is also set. | |
| | | |
| | A value for ``sum`` may be found in the ``go.sum`` file or by running | |
| | ``go mod download -json <module>@<version>``. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`build_naming_convention` | :type:`string` | :value:`""` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | Sets the library naming convention to use when resolving dependencies against this external | |
| | repository. If unset, the convention from the external workspace is used. | |
| | Legal values are ``go_default_library``, ``import``, and ``import_alias``. | |
| | | |
| | See ``-go_naming_convention`` for more information. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`replace` | :type:`string` | :value:`""` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | A replacement for the module named by ``importpath``. The module named by | |
| | ``replace`` will be downloaded at ``version`` and verified with ``sum``. | |
| | | |
| | NOTE: There is no ``go_repository`` equivalent to file path ``replace`` | |
| | directives. Use ``local_repository`` instead. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`commit` | :type:`string` | :value:`""` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | If the repository is downloaded using a version control tool, this is the | |
| | commit or revision to check out. With git, this would be a sha1 commit id. | |
| | ``commit`` and ``tag`` may not both be set. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`tag` | :type:`string` | :value:`""` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | If the repository is downloaded using a version control tool, this is the | |
| | named revision to check out. ``commit`` and ``tag`` may not both be set. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`vcs` | :type:`string` | :value:`""` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | One of ``"git"``, ``"hg"``, ``"svn"``, ``"bzr"``. | |
| | | |
| | The version control system to use. This is usually determined automatically, | |
| | but it may be necessary to set this when ``remote`` is set and the VCS cannot | |
| | be inferred. You must have the corresponding tool installed on your host. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`remote` | :type:`string` | :value:`""` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | The VCS location where the repository should be downloaded from. This is | |
| | usually inferred from ``importpath``, but you can set ``remote`` to download | |
| | from a private repository or a fork. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`urls` | :type:`string list` | :value:`[]` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | A list of HTTP(S) URLs where an archive containing the project can be | |
| | downloaded. Bazel will attempt to download from the first URL; the others | |
| | are mirrors. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`strip_prefix` | :type:`string` | :value:`""` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | If the repository is downloaded via HTTP (``urls`` is set), this is a | |
| | directory prefix to strip. See `http_archive.strip_prefix`_. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`type` | :type:`string` | :value:`""` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | One of ``"zip"``, ``"tar.gz"``, ``"tgz"``, ``"tar.bz2"``, ``"tar.xz"``. | |
| | | |
| | If the repository is downloaded via HTTP (``urls`` is set), this is the | |
| | file format of the repository archive. This is normally inferred from the | |
| | downloaded file name. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`sha256` | :type:`string` | :value:`""` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | If the repository is downloaded via HTTP (``urls`` is set), this is the | |
| | SHA-256 sum of the downloaded archive. When set, Bazel will verify the archive | |
| | against this sum before extracting it. | |
| | | |
| | **CAUTION:** Do not use this with services that prepare source archives on | |
| | demand, such as codeload.github.com. Any minor change in the server software | |
| | can cause differences in file order, alignment, and compression that break | |
| | SHA-256 sums. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`build_file_generation` | :type:`string` | :value:`"auto"` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | One of ``"auto"``, ``"on"``, ``"off"``. | |
| | | |
| | Whether Gazelle should generate build files in the repository. In ``"auto"`` | |
| | mode, Gazelle will run if there is no build file in the repository root | |
| | directory. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`build_config` | :type:`label` | :value:`@bazel_gazelle_go_repository_config//:WORKSPACE` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | A file that Gazelle should read to learn about external repositories before | |
| | generating build files. This is useful for dependency resolution. For example, | |
| | a ``go_repository`` rule in this file establishes a mapping between a | |
| | repository name like ``golang.org/x/tools`` and a workspace name like | |
| | ``org_golang_x_tools``. Workspace directives like | |
| | ``# gazelle:repository_macro`` are recognized. | |
| | | |
| | ``go_repository`` rules will be re-evaluated when parts of WORKSPACE related | |
| | to Gazelle's configuration are changed, including Gazelle directives and | |
| | ``go_repository`` ``name`` and ``importpath`` attributes. | |
| | Their content should still be fetched from a local cache, but build files | |
| | will be regenerated. If this is not desirable, ``build_config`` may be set | |
| | to a less frequently updated file or ``None`` to disable this functionality. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`build_file_name` | :type:`string` | :value:`BUILD.bazel,BUILD` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | Comma-separated list of names Gazelle will consider to be build files. | |
| | If a repository contains files named ``build`` that aren't related to Bazel, | |
| | it may help to set this to ``"BUILD.bazel"``, especially on case-insensitive | |
| | file systems. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`build_external` | :type:`string` | :value:`""` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | One of ``"external"``, ``"vendored"``. | |
| | | |
| | This sets Gazelle's ``-external`` command line flag. | |
| | | |
| | **NOTE:** This cannot be used to ignore the ``vendor`` directory in a | |
| | repository. The ``-external`` flag only controls how Gazelle resolves | |
| | imports which are not present in the repository. Use | |
| | ``build_extra_args = ["-exclude=vendor"]`` instead. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`build_tags` | :type:`string list` | :value:`[]` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | This sets Gazelle's ``-build_tags`` command line flag. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`build_file_proto_mode` | :type:`string` | :value:`""` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | One of ``"default"``, ``"legacy"``, ``"disable"``, ``"disable_global"`` or | |
| | ``"package"``. | |
| | | |
| | This sets Gazelle's ``-proto`` command line flag. See Directives_ for more | |
| | information on each mode. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`build_extra_args` | :type:`string list` | :value:`[]` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | A list of additional command line arguments to pass to Gazelle when | |
| | generating build files. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`build_directives` | :type:`string list` | :value:`[]` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | A list of directives to be written to the root level build file before | |
| | Calling Gazelle to generate build files. Each string in the list will be | |
| | prefixed with `#` automatically. A common use case is to pass a list of | |
| | Gazelle directives. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`patches` | :type:`label list` | :value:`[]` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | A list of patches to apply to the repository after gazelle runs. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`patch_tool` | :type:`string` | :value:`"patch"` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | The patch tool used to apply ``patches``. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`patch_args` | :type:`string list` | :value:`["-p0"]` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | Arguments passed to the patch tool when applying patches. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | :param:`patch_cmds` | :type:`string list` | :value:`[]` | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| | Commands to run in the repository after patches are applied. | |
| +------------------------------------+----------------------+---------------------------------------------------------------+ |
| |
| git_repository |
| -------------- |
| |
| **NOTE:** ``git_repository`` is deprecated in favor of the rule of the same name |
| in `@bazel_tools//tools/build_defs/repo:git.bzl`_. |
| |
| ``git_repository`` downloads a project with git. It has the same features as the |
| `native git_repository rule`_, but it also allows you to copy a set of files |
| into the repository after download. This is particularly useful for placing |
| pre-generated build files. |
| |
| **Example** |
| |
| .. code:: bzl |
| |
| load("@bazel_gazelle//:deps.bzl", "git_repository") |
| |
| git_repository( |
| name = "com_github_pkg_errors", |
| remote = "https://github.com/pkg/errors", |
| commit = "816c9085562cd7ee03e7f8188a1cfd942858cded", |
| overlay = { |
| "@my_repo//third_party:com_github_pkg_errors/BUILD.bazel.in" : "BUILD.bazel", |
| }, |
| ) |
| |
| **Attributes** |
| |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | **Name** | **Type** | **Default value** | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | :param:`name` | :type:`string` | |mandatory| | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | A unique name for this rule. This should usually be the Java-package-style | |
| | name of the URL, with underscores as separators, for example, | |
| | ``com_github_example_project``. | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | :param:`remote` | :type:`string` | |mandatory| | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | The remote repository to download. | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | :param:`commit` | :type:`string` | :value:`""` | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | The git commit to check out. Either ``commit`` or ``tag`` may be specified. | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | :param:`tag` | :type:`tag` | :value:`""` | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | The git tag to check out. Either ``commit`` or ``tag`` may be specified. | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | :param:`overlay` | :type:`dict` | :value:`{}` | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | A set of files to copy into the downloaded repository. The keys in this | |
| | dictionary are Bazel labels that point to the files to copy. These must be | |
| | fully qualified labels (i.e., ``@repo//pkg:name``) because relative labels | |
| | are interpreted in the checked out repository, not the repository containing | |
| | the WORKSPACE file. The values in this dictionary are root-relative paths | |
| | where the overlay files should be written. | |
| | | |
| | It's convenient to store the overlay dictionaries for all repositories in | |
| | a separate .bzl file. See Gazelle's `manifest.bzl`_ for an example. | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| |
| http_archive |
| ------------ |
| |
| **NOTE:** ``http_archive`` is deprecated in favor of the rule of the same name |
| in `@bazel_tools//tools/build_defs/repo:http.bzl`_. |
| |
| ``http_archive`` downloads a project over HTTP(S). It has the same features as |
| the `native http_archive rule`_, but it also allows you to copy a set of files |
| into the repository after download. This is particularly useful for placing |
| pre-generated build files. |
| |
| **Example** |
| |
| .. code:: bzl |
| |
| load("@bazel_gazelle//:deps.bzl", "http_archive") |
| |
| http_archive( |
| name = "com_github_pkg_errors", |
| urls = ["https://codeload.github.com/pkg/errors/zip/816c9085562cd7ee03e7f8188a1cfd942858cded"], |
| strip_prefix = "errors-816c9085562cd7ee03e7f8188a1cfd942858cded", |
| type = "zip", |
| overlay = { |
| "@my_repo//third_party:com_github_pkg_errors/BUILD.bazel.in" : "BUILD.bazel", |
| }, |
| ) |
| |
| **Attributes** |
| |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | **Name** | **Type** | **Default value** | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | :param:`name` | :type:`string` | |mandatory| | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | A unique name for this rule. This should usually be the Java-package-style | |
| | name of the URL, with underscores as separators, for example, | |
| | ``com_github_example_project``. | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | :param:`urls` | :type:`string list` | |mandatory| | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | A list of HTTP(S) URLs where the project can be downloaded. Bazel will | |
| | attempt to download the first URL; the others are mirrors. | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | :param:`sha256` | :type:`string` | :value:`""` | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | The SHA-256 sum of the downloaded archive. When set, Bazel will verify the | |
| | archive against this sum before extracting it. | |
| | | |
| | **CAUTION:** Do not use this with services that prepare source archives on | |
| | demand, such as codeload.github.com. Any minor change in the server software | |
| | can cause differences in file order, alignment, and compression that break | |
| | SHA-256 sums. | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | :param:`strip_prefix` | :type:`string` | :value:`""` | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | A directory prefix to strip. See `http_archive.strip_prefix`_. | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | :param:`type` | :type:`string` | :value:`""` | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | One of ``"zip"``, ``"tar.gz"``, ``"tgz"``, ``"tar.bz2"``, ``"tar.xz"``. | |
| | | |
| | The file format of the repository archive. This is normally inferred from | |
| | the downloaded file name. | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | :param:`overlay` | :type:`dict` | :value:`{}` | |
| +--------------------------------+----------------------+-------------------------------------------------+ |
| | A set of files to copy into the downloaded repository. The keys in this | |
| | dictionary are Bazel labels that point to the files to copy. These must be | |
| | fully qualified labels (i.e., ``@repo//pkg:name``) because relative labels | |
| | are interpreted in the checked out repository, not the repository containing | |
| | the WORKSPACE file. The values in this dictionary are root-relative paths | |
| | where the overlay files should be written. | |
| | | |
| | It's convenient to store the overlay dictionaries for all repositories in | |
| | a separate .bzl file. See Gazelle's `manifest.bzl`_ for an example. | |
| +--------------------------------+----------------------+-------------------------------------------------+ |