跳转到内容

在大型项目中使用 Biome

Biome 提供了一系列功能,有助于在大型项目中使用,例如 monorepo 或包含多个项目的 workspace。

当使用 Biome 功能时(无论是通过 CLI 还是 LSP),工具会查找距离当前工作目录最近的配置文件。

如果 Biome 没有找到配置文件,它会 向上遍历 文件系统,直到找到一个配置文件为止。

您可以利用此功能为不同的项目/文件夹应用不同的配置。

假设我们有一个大型项目,其中包含一个前端项目和一个后端项目。

  • 文件夹app
    • 文件夹backend
      • biome.json
      • package.json
    • 文件夹frontend
      • biome.json
      • 文件夹legacy-app
        • package.json
      • 文件夹new-app
        • package.json

此示例说明了当您在 app/backend 目录中运行 Biome 时,Biome 将使用 app/backend/biome.json 配置文件。 而当您在 app/frontend/legacy-appapp/frontend/new-app 目录中运行时,Biome 则会使用 app/frontend/biome.json 配置文件。

Monorepo 是一个包含多个包的大型代码仓库。每个包都可以拥有其独立的配置。

自 v2 版本起,Biome 原生支持 monorepo,您需要按以下步骤进行配置:

  1. 在 Monorepo 根目录创建 biome.json 文件。我们将启用推荐规则并配置格式化选项:

    biome.json
    {
    "linter": {
    "enabled": true,
    "rules": {
    "recommended": true
    }
    },
    "formatter": {
    "lineWidth": 120,
    "indentStyle": "space",
    "indentWidth": 6
    }
    }

    此文件为 根配置,用于设定项目的通用选项。嵌套配置可以选择是否继承这些选项。

  2. 为各个包创建嵌套配置文件(可根据需要创建)。 这些嵌套配置文件必须包含 "root" 字段并设置为 false。 此外,若要确保各包遵循根配置中的格式化规范, 我们可以使用 Biome 的 新语法 "extends": "//"。 该语法指示 Biome 从 根配置 继承设置,无论嵌套配置位于何处。

    我们来创建两个配置文件,分别位于 packages/loggerpackages/generate 目录下。 在前者的配置中,我们将禁用 noConsole 规则, 在后者的配置中,我们将禁用格式化功能,因为这些是自动生成的源代码文件:

    packages/logger/biome.json
    {
    "root": false,
    "extends": "//",
    "linter": {
    "rules": {
    "suspicious": {
    "noConsole": "off"
    }
    }
    }
    }
    packages/generate/biome.json
    {
    "root": false,
    "extends": "//",
    "formatter": {
    "enabled": false
    }
    }

    为便于使用,我们 可以 省略 "root": false,因为当存在 extends 字段时,该值已被隐式设定:

    packages/generate/biome.json
    {
    "root": false,
    "extends": "//",
    "formatter": {
    enabled: false
    }
  3. 现在,假设新增一个包位于 packages/analytics,并由另一团队维护。 若该团队采用不同的编码规范,不希望继承根配置, 则只需省略 "extends": "//" 并自定义格式化选项:

    packages/analytics/biome.json
    {
    "root": false,
    "formatter": {
    "lineWidth": 100
    }
    }
  4. 配置完成后,您可以从根目录运行 biome 命令,也可以在单个包目录中运行。 Biome 将自动遵循相应的配置设置!

如前所述,extends 字段支持将配置拆分为多个文件。 借助此机制,可在多个包或不同目录间共享通用配置。 虽然 "extends": "//" 语法是在嵌套配置中继承根配置的便捷方式, 但在某些情况下您可能需要更灵活的配置方案。

"//" 外,extends 设置还接受数组形式的值。此时,数组中的每项都应指向另一个配置文件的路径。

例如,可通过如下方式配置以扩展 common.json 配置文件:

biome.json
{
"extends": ["./common.json"]
}

extends 中定义的条目相对于 biome.json 文件所在路径进行解析。各项按列表顺序处理,靠后的文件配置将覆盖先前的设置。

extend 的文件不能进一步 extend 其他文件。

请注意,配置文件中的路径始终相对于 biome.json/biome.jsonc 文件所在目录进行解析。使用 extends 字段时,这意味着共享配置中的路径是相对于引用它的配置文件位置解析的,而非被引用文件所在目录。

例如,假设项目包含 backend/frontend/ 两个目录,各自拥有 biome.json 文件,均扩展根目录下的 common.json 配置:

  • 文件夹backend/
    • 文件夹src/
    • 文件夹test/
    • biome.json
  • 文件夹frontend/
    • 文件夹src/
    • 文件夹test/
    • biome.json
  • common.json
common.json
{
"files": {
"includes": ["src/**/*.js", "test/**/*.js"]
},
"linter": {
"includes": ["**", "!test"]
}
}
frontend/biome.json
{
"extends": ["../common.json"]
}
  • 当从 frontend/ 目录运行 Biome 时,将配置为格式化和检查 frontend/src/frontend/test/ 目录中的所有 JavaScript 文件, 但仅格式化 frontend/src/ 目录中的文件。这是因为 common.json 中指定的路径相对于 frontend/ 目录解析,因为 biome.json 文件位于该目录中。
  • 假设 backend/biome.jsonfrontend/biome.json 配置相同,则行为一致,只是路径将相对于 backend/ 目录解析。

请注意,在这种配置下,frontend/biome.jsonbackend/biome.json 均视为根配置。除非使用 --config-path CLI 选项并指向特定配置, 否则无法从仓库根目录运行 Biome。

Biome 支持解析 node_modules/ 目录中的配置文件。 因此可将 Biome 配置打包为 NPM 包,在多个项目间共享使用。

实现此目的的第一步是建立”共享” Biome 配置。 假设您拥有名为 @org/shared-configs 的包,并使用 @org/shared-configs/biome 作为配置标识符。 您需要在 package.json 中添加 exports 字段:

package.json
{
"name": "@org/shared-configs",
"type": "module",
"exports": {
"./biome": "./biome.json"
}
}

确保 @org/shared-configs 包已在您的项目中正确安装,并按如下方式更新 biome.json 配置文件:

biome.json
{
"extends": ["@org/shared-configs/biome"]
}

Biome 将尝试从您的工作目录解析 @org/shared-configs/ 库。工作目录是指:

  • 使用 CLI 时为您执行命令的目录,通常与 package.json 文件位置一致;
  • 使用 LSP 时为项目的根目录。

有关解析算法的更多信息,请参阅 Node.js 文档