概要
本記事では、先日リリースされたBiome v2への移行手順と、設定ファイル(biome.json
またはbiome.jsonc
)のモノレポでの振る舞いを試してみた結果を共有します。
はじめに
こんにちは、フリューのソフトウェアエンジニアkitajimaです。ピクトリンクの開発を担当しています。
2025年6月17日にBiome v2(codename: Biotype)がリリースされました。
tscを必要としないlinterという部分が目玉だとは思うのですが、トピックにはモノレポのサポート改善も含まれていました。
ちょうど業務で触っているモノレポがBiomeのv1を使っていたため、実際にBiome v2にアップデートしてモノレポでの運用を試してみました。既存のコードや複雑な設定が無い状態での移行だったので、個人的にも良いタイミングでした。
従来のBiome v1でのモノレポ運用
従来のBiome v1では、モノレポに対する十分なサポートがありませんでした。
Biome doesn’t support monorepos very well due to some limitations in resolving nested configuration files
と公式ドキュメントにも記載されています。 モノレポでの運用は、
- プロジェクトルートに
biome.json
を配置 - 各サブモジュールにも
biome.json
を配置- ルートの
biome.json
を相対パスで参照する形でextends
を指定 overrides
設定でサブモジュール固有の設定を記述
- ルートの
といった形で行う必要がありました。
Use Biome in big projects | Biome
この方法でも動作はしましたが、Biome v2では以下のようにモノレポのサポートが改善されました。
Biome v2で改善されたモノレポサポート
Biome v2では、以下の機能が追加されモノレポでの運用が改善されました。
Biome v2—codename: Biotype | Biome
ネストした設定ファイルの配置
サブディレクトリにネストした設定ファイルを任意の数だけ配置できるようになりました。
ネストした設定ファイルでルートの設定を参照する
設定ファイルがネストされたものであることを示す方法が2つあります。
1. root
プロパティ
{ "root": false }
root
プロパティをfalse
に設定することで、この設定ファイルがネストしたファイルであることを示せます。
ただし、このままではルートの設定を継承しません。継承したい場合はextends
プロパティを使用する必要があります。
2. extends
プロパティ
{ "extends": "//" }
extends
プロパティをこのように指定することで、ルート設定を継承できます。この場合、root: false
は冗長なので省略可能です。
※ネストしているbiome.json
ではroot: false
またはextends
プロパティが必須
実際にBiome v2に移行してみた
マイグレーションガイドに沿って移行を進めてみました。
1. Biome v2のインストール
Biome v2(執筆時点で最新は v2.0.0)をインストールします。
npm install --save-dev --save-exact @biomejs/biome@2.0.0
2. マイグレーションコマンドの実行
migrate
コマンドを実行することで、破壊的変更の影響を最小限に抑えるように設定ファイルを修正してくれます。
npx @biomejs/biome migrate --write
3. 設定ファイルの変更確認
コマンド実行後、ルートのbiome.json
が以下のように変更されていました。
変更前(v1.9.4)
{ "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", "vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true }, "files": { "ignoreUnknown": false, "ignore": [] }, "formatter": { "enabled": true, "indentStyle": "space" }, "organizeImports": { "enabled": true }, "linter": { "enabled": true, "rules": { "recommended": true } }, "javascript": { "formatter": { "quoteStyle": "single" } } }
変更後(v2.0.0)
{ "$schema": "https://biomejs.dev/schemas/2.0.0/schema.json", "vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true }, "files": { "ignoreUnknown": false, "includes": ["**"] }, "formatter": { "enabled": true, "indentStyle": "space" }, "assist": { "actions": { "source": { "organizeImports": "on" } } }, "linter": { "enabled": true, "rules": { "recommended": true, "style": { "noParameterAssign": "error", "useAsConstAssertion": "error", "useDefaultParameterLast": "error", "useEnumInitializers": "error", "useSelfClosingElements": "error", "useSingleVarDeclarator": "error", "noUnusedTemplateLiteral": "error", "useNumberNamespace": "error", "noInferrableTypes": "error", "noUselessElse": "error" } } }, "javascript": { "formatter": { "quoteStyle": "single" } } }
差分を確認してみる
organizeImportsの設定変更
v1.9.4時点ではorganizeImports
という項目がトップレベルにありましたが、v2ではassist.actions.source.organizeImports
に移動し、assist
の一部として扱われるようになりました。
なお、assist
はエディタやIDEを通して開発体験の向上に役に立つ機能全般のことで、v2から登場しました。エディタの拡張機能を利用することでファイル保存時に自動で適用するなどの利用が想定されています。
recommendedルールの変更
recommendedに含まれるルールが変更されたため、noParameterAssign
など削除されたルールがlinter.rules.style
に明示的に追加されました。
今回は新規プロジェクトということもあり、recommendedのルールが変わることに抵抗が無かったためこれらの追加ルールは手動で削除しました。
モノレポでの設定ファイルの振る舞いを検証
実際にモノレポ環境で設定ファイルを配置し、Biome checkがどのように動作するかを検証してみました。
プロジェクト構成
以下のような構成のモノレポを想定しています(一部抜粋)。
. ├── package.json ├── biome.json ├── packages │ ├── module-a │ │ ├── package.json │ │ └── biome.json │ └── module-b │ ├── package.json │ └── biome.json
各設定ファイルの内容(一部抜粋)
プロジェクトルート(インデントを4スペースに指定)
{ "$schema": "https://biomejs.dev/schemas/2.0.0/schema.json", "formatter": { "enabled": true, "indentStyle": "space", "indentWidth": 4 } }
module-a(ルート設定を継承)
{ "$schema": "https://biomejs.dev/schemas/2.0.0/schema.json", "root": false, "extends": "//" }
module-b(独自設定を使用)
{ "$schema": "https://biomejs.dev/schemas/2.0.0/schema.json", "root": false, "javascript": { "formatter": { "quoteStyle": "single" } } }
この状態で、プロジェクトルートで
npx @biomejs/biome check --write .
を実行します。
検証結果
各モジュールでの設定適用結果は以下のようになりました。
ルートに属するファイル
- インデント幅:4スペース
- JavaScriptのクォート:ダブルクォート(デフォルト設定)
module-aに属するファイル
- インデント幅:4スペース(ルート設定を継承)
- JavaScriptのクォート:ダブルクォート(ルート設定を継承)
module-bに属するファイル
- インデント幅:タブ(デフォルト設定、ルート設定を継承しない)
- JavaScriptのクォート:シングルクォート(module-b独自の設定)
各設定ファイルの内容がlint, formatの結果に意図通り反映されていました。
さいごに
Biomeをv2にアップデートすることで、特にモノレポにおいてサブモジュールが増えたときなど今後の運用が楽になると感じました。
個人的には、設定はツールのデフォルトに従い、カスタムは最低限にして管理を楽にしたいと思っています。
(ただしデフォルトtabインデントだけはカスタムしたい・・・!)