Bazel 使用以目录树形式整理的源代码构建软件,称为
代码库工作区由一组定义的代码库组成。来源
软件库中的文件在软件包的嵌套层次结构中进行组织,其中
每个包都是一个目录,其中包含一组相关源文件和一个
BUILD
文件。BUILD
文件指定可以构建哪些软件输出
来源。
代码库
Bazel 构建中使用的源文件整理出代码库(通常
简称“代码库”)。代码库是一种目录树,在
其根;这样的边界标记文件可以是 MODULE.bazel
、REPO.bazel
或
WORKSPACE
或 WORKSPACE.bazel
。
运行当前 Bazel 命令的代码库称为主代码库 代码库。其他(外部)代码库由代码库规则定义;请参阅外部 依赖项概览。
工作区
工作区是由所有 Bazel 命令在同一 主代码库它包含主代码库以及所有已定义的外部代码库 代码库。
请注意,过去“仓库”的概念和“workspace”曾经 混淆;术语“工作区”通常用于指代 有时甚至被用作“仓库”的同义词。
软件包
代码库中代码组织的主要单元是软件包。答 package 是相关文件的集合以及有关如何使用它们的 用于生成输出工件。
包是指包含
名为 BUILD
或 BUILD.bazel
的 BUILD
文件。答
package 包含其目录中的所有文件及其下的所有子目录,
本身包含 BUILD
文件的那些文件除外。根据此定义,
文件或目录可能属于两个不同的软件包。
例如,以下目录树中有两个软件包:my/app
,
和子软件包 my/app/tests
。请注意,my/app/data
不是软件包,
属于软件包 my/app
的目录。
src/my/app/BUILD
src/my/app/app.cc
src/my/app/data/input.txt
src/my/app/tests/BUILD
src/my/app/tests/test.cc
目标
软件包是目标的容器,目标在软件包的
BUILD
文件。大多数目标都属于以下两种主要类型之一:文件和规则。
文件进一步分为两种类型。源文件通常由 并签到代码库。生成的文件、 (有时称为派生文件或输出文件)不会签入,但会 从源文件生成的内容。
第二种目标使用规则进行声明。每个规则实例 指定一组输入和一组输出文件之间的关系。通过 规则的输入可以是源文件,但也可以是其他 规则。
规则的输入是源文件还是生成的文件, 无实质性的情况;重要的只是该文件的内容事实 可以轻松将复杂的源文件替换为 例如,必须手动维护 结构化文件变得太令人厌烦,有人编写了程序来派生它。 该文件的使用者无需进行任何更改。相反, 文件可以轻而易举地替换为只进行本地更改的源文件。
规则的输入可能还包括“其他规则”。此类的确切含义 往往非常复杂,且取决于语言或规则, 直观地说,这很简单:C++ 库规则 A 可能具有另一个 C++ 库 规则 B。此依赖项的作用是,将 B 的头文件 在编译期间提供给 A 使用,但在编译期间 B 的符号可供 A 因此在执行期间 A 将可以使用 B 的运行时数据。
所有规则都有一个不变的原则是,规则生成的文件始终属于 与规则本身相同的软件包;无法将文件生成为 另一个软件包。规则的输入来自另一个规则,这种情况很常见。 还是“软件包”
软件包组是一组软件包,其目的是限制
特定规则软件包组由 package_group
函数定义。他们
具有三个属性:其所含软件包的列表、名称以及其他
它们包含的软件包组。引用这些变量的唯一方式是
规则的 visibility
属性,或来自以下规则的 default_visibility
属性:
package
函数;而不会生成或使用文件有关
信息,请参阅 package_group
文档。
<ph type="x-smartling-placeholder"></ph> 标签