コンテンツにスキップ

大規模プロジェクトでの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を設定ファイルとして使用します。

extendsオプションを使用して、オプションを複数ファイルに分割することができる。

例えば、以下の要件があるとします:

  • legacy-appディレクトリでは、スペースでフォーマットする
  • backendディレクトリとnew-appディレクトリでは、タブでフォーマットする
  • すべてのディレクトリでは、行幅を120でフォーマットする
  • backendディレクトリでは、追加で他のリント設定を行う

まず、app/biome.jsonに新しい設定ファイルを作成し、共通オプションの設定を行います:

app/biome.json
{
"formatter": {
"enabled": true,
"lineWidth": 120
}
}

ここで、legacy-appディレクトリで別のオプションを使用するため、app/frontend/biome.jsonapp/frontend/legacy-app/移動します:

app/frontend/legacy-app/biome.json
{
"formatter": {
"indentStyle": "space"
}
}

次に、extendsプロパティを使って、app/biome.jsonのすべてのオプションを継承するように設定を加えます:

app/frontend/legacy-app/biome.json
{
"extends": ["../../biome.json"],
"formatter": {
"indentStyle": "space"
}
}

最後に、app/backend/biome.jsonでリンタを有効にします:

app/backend/biome.json
{
"extends": ["../biome.json"],
"linter": {
"enabled": true,
"rules": {
"recommended": true
}
}
}

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

Biomeはネストされた設定ファイルの解決においていくらかの制限があり、モノレポを適切にサポートしていません。関連したIssueを手伝い、フォローしてください。

現在の制限の下でより良い開発者体験を実現するには、モノレポのルートに biome.json を配置し、overrides 設定を使っていくつかのパッケージでBiomeの動作を変更することを推奨しています。

以下の例では、パッケージ packages/logger の中ではルール suspecious/noConsoleLog を無効化しています。

biome.jsonc
{
"linter": {
"enabled": true,
"rules": {
"recommended": true
}
},
"overrides": [{
"include": ["packages/logger/**"],
"linter": {
"rules": {
"suspicious": {
"noConsoleLog": "off"
}
}
}
}]
}