代码库、工作区、软件包和目标

<ph type="x-smartling-placeholder"></ph> 报告问题 <ph type="x-smartling-placeholder"></ph> 查看来源 每晚 · 7.2 条 · 7.1敬上 · 7.0 · 6.5 · 6.4

Bazel 使用以目录树形式整理的源代码构建软件,称为 代码库工作区由一组定义的代码库组成。来源 软件库中的文件在软件包的嵌套层次结构中进行组织,其中 每个包都是一个目录,其中包含一组相关源文件和一个 BUILD 文件。BUILD 文件指定可以构建哪些软件输出 来源。

代码库

Bazel 构建中使用的源文件整理出代码库(通常 简称“代码库”)。代码库是一种目录树,在 其根;这样的边界标记文件可以是 MODULE.bazelREPO.bazelWORKSPACEWORKSPACE.bazel

运行当前 Bazel 命令的代码库称为主代码库 代码库。其他(外部)代码库由代码库规则定义;请参阅外部 依赖项概览

工作区

工作区是由所有 Bazel 命令在同一 主代码库它包含主代码库以及所有已定义的外部代码库 代码库。

请注意,过去“仓库”的概念和“workspace”曾经 混淆;术语“工作区”通常用于指代 有时甚至被用作“仓库”的同义词。

软件包

代码库中代码组织的主要单元是软件包。答 package 是相关文件的集合以及有关如何使用它们的 用于生成输出工件。

包是指包含 名为 BUILDBUILD.bazelBUILD 文件。答 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> 标签