コンテンツにスキップ

大規模プロジェクトでのBiomeの使用方法

Biomeは、モノレポや複数のプロジェクトを含むワークスペースなどの大規模なプロジェクトで、適切に使用するためのツールを提供しています。

Biomeの機能をCLIやLSPで使用する場合、ツールは現在の作業ディレクトリから最も近い設定ファイルを参照します。

設定ファイルが見つからない場合、Biomeは設定ファイルが見つかるまで、上位ディレクトリへ向かって探索します。

この機能を活用して、プロジェクトやディレクトリごとに異なるオプションを適用することができます。

例えば、backendディレクトリとfrontendディレクトリを含むプロジェクトがあるとします。

  • ディレクトリapp
    • ディレクトリbackend
      • biome.json
      • package.json
    • ディレクトリfrontend
      • biome.json
      • ディレクトリlegacy-app
        • package.json
      • ディレクトリnew-app
        • package.json

この場合、app/backend/package.jsonからスクリプトを実行すると、Biomeはapp/backend/biome.jsonを設定ファイルとして使用します。

app/frontend/legacy-app/package.jsonまたはapp/frontend/new-app/package.jsonからスクリプトを実行すると、Biomeはapp/frontend/biome.jsonを設定ファイルとして使用します。

モノレポは、複数のライブラリを単一の大きなリポジトリに保存して管理されるリポジトリです。 それぞれのライブラリは独立したプロジェクトであり、異なる構成を持つことがあります。

v2以降、Biomeはモノレポを標準でサポートしています。プロジェクトは以下のように設定する必要があります。

  1. モノレポのルートにbiome.jsonファイルを作成します。推奨ルールを使用し、フォーマッターオプションをカスタマイズします。

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

    このファイルはルート設定と呼ばれ、プロジェクト全体に適用される基本オプションを定義します。 ただし、ネストされた設定では、これらのオプションに従うかどうかを個別に判断できます。 それでは、その仕組みを見ていきましょう。

  2. 必要な各パッケージに、ネストされた設定ファイルを作成します。これらのネストされた設定ファイルでは、フィールド"root"falseに設定する必要があります。

    また、これらのパッケージには、ルート設定で定義されたフォーマットの基準を適用したいと考えています。 そのために、Biome v2で利用可能になった新しいマイクロシンタックス "extends": "//"を設定ファイルとして使用します。 この構文は、ネストされた設定がどこに置かれていても、ルート設定を継承することをBiomeに指示します。

    それでは、packages/loggerpackages/generateのそれぞれに設定ファイルを1つずつ作成しましょう。 前者では、noConsoleを無効化し、後者では、コード生成されたファイルであるためフォーマッターを無効化します。

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

    便宜上、マイクロシンタックスextends: "//"を使用する場合は、この設定がルート設定ではないことがすでに暗黙的に示されているため、 "root": false省略できます。

    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はすべての設定を正しく反映します。

設定ファイルを共有するその他の方法

Section titled “設定ファイルを共有するその他の方法”

これまで見てきたように、extendsフィールドを使用することで、設定を複数のファイルに分割することができます。 これにより、異なるプロジェクトやフォルダ間で共通の設定を共有することが可能になります。

"extends": "//"構文は、ネストされた設定をルート設定から継承させたい場合に便利なショートカットですが、 場合によっては、さらにカスタマイズされた設定を使用したいこともあるでしょう。

"//"以外にも、extends設定は配列の値を受け取ることができます。 この場合、配列内の各値は、継承元となる別の設定ファイルへのパスである必要があります。

例えば、common.jsonという設定ファイルを継承するように設定する場合は、次のようになります。

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

extendsに定義されたエントリは、biome.jsonファイルが定義されているパスを基準に解決されます。 これらは記載されている順番で処理され、後に指定されたファイルの設定が、先に指定されたものを上書きします。

extendsによって継承されるファイルは、さらに別のファイルをextendすることはできません。

なお、設定ファイル内のパスは常に、biome.json/biome.jsoncファイルが存在するフォルダを基準に解決されます。 そのためextendsフィールドを使用する場合、共有設定ファイル内に記述されたパスは、継承元のファイルの場所ではなく、 それを継承している設定ファイルの場所を基準に解釈されます。

たとえば、backend/frontend/という2つのディレクトリを持つプロジェクトがあり、それぞれに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に指定されたパスが、biome.jsonファイルが存在するfrontend/フォルダを基準に解釈されるためです。

  • backend/biome.jsonfrontend/biome.jsonと同じ内容であると仮定すると、ふるまいも同様になりますが、パスはbackend/フォルダを基準に解釈されます。

なお、この構成では、frontend/biome.jsonbackend/biome.jsonの両方がルート設定として扱われます。 そのため、--config-path CLIオプションを使用していずれかの設定ファイルを指定しない限り、リポジトリのルートからBiomeを実行することはできません。

NPMパッケージからのBiome設定のエクスポート

Section titled “NPMパッケージからのBiome設定のエクスポート”

Biomeはnode_modules/フォルダ内にある設定ファイルも解決できます。 そのため、設定ファイルをパッケージとして公開し、複数のプロジェクトからそれをインポートして利用することが可能です。

これを行うには、まず「共有」用のBiome設定をある決まった形で用意する必要があります。 たとえば、@org/shared-configsというパッケージから@org/shared-configs/biomeという指定子を使って設定を共有したいとしましょう。 その場合、このパッケージのpackage.jsonexportsエントリを作成する必要があります。

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 documentationを参照してください。