`--silent` オプションで CLIの非エラー出力を抑制
@tailwindcss/cli に --silent フラグが追加され、ヘッダーや "Done in Xms" などの通常出力を抑制しつつ、エラーメッセージは引き続き stderr に出力できるようになりました。
背景
@tailwindcss/cli はビルド成功時の統計情報を stderr に出力しており、これが一部のビルドシステムで誤検知を引き起こしていました。Issue #8050 で報告されているように、RushJS などのビルドシステムは stderr への出力をプロセスの成功・失敗に関わらずビルド失敗として扱います。Tailwind CLI はビルドが成功しても "Done in XXms." を stderr に書き込むため、正常終了にもかかわらずビルド失敗と判定されるという問題がありました。
また、foreman などで複数プロセスを並行して起動する開発環境では、Tailwind のビルド完了メッセージがログに繰り返し出力され、他のサービスのログが埋もれてしまうという問題もありました。既存の回避策としてはシェルスクリプトで stderr を解析して "Done in" の行だけを除去する方法がありましたが、実際のエラーを誤って捨ててしまうリスクを伴う煩雑な方法でした。
技術的な変更
packages/@tailwindcss-cli/src/commands/build/index.ts の options() 関数に --silent フラグが追加され、handle() 関数内の各出力箇所がこのフラグで制御されるようになりました。
変更の核心は、handle() 関数内の eprintln 呼び出しに --silent チェックが追加された点です。
変更前:
eprintln(header())
eprintln()
// ...
eprintln(`Done in ${formatDuration(end - start)}`)
変更後:
if (!args['--silent']) eprintln(header())
if (!args['--silent']) eprintln()
// ...
if (!args['--silent']) eprintln(`Done in ${formatDuration(end - start)}`)
--silent フラグが立っている場合に抑制されるのは次の出力です:
- 起動時のバージョンヘッダー(
tailwindcss vX.X.Xの表示) - ヘッダー直後の空行
- ビルド完了時の
Done in Xmsメッセージ(初回ビルド・ウォッチモード両方)
一方、エラー処理のコードパスは変更されていないため、ビルドエラーは --silent の有無にかかわらず引き続き stderr に出力されます。
統合テストとして integrations/cli/index.test.ts にも検証が追加されています。--silent なしの通常ビルドでは Done in が出力に含まれること、--silent ありでは Done in も tailwindcss v も出力に含まれないことを確認しつつ、CSS の生成物が同一であることも検証しています。
設計判断
オプション名は当初 --quiet が提案されましたが、最終的に --silent が採用されました。PR の元の投稿では --quiet が提案されていましたが、メンテナーによって --silent に変更されています。
実装は既存の eprintln 呼び出しをインラインの条件式でガードするシンプルな変更です。新たな抽象レイヤーを設けず、最小限の変更でフラグのセマンティクスを実現しています。エラーパスを意図的に変更しないことで、「静かに成功し、しっかり失敗を伝える」という CLIツールとして望ましい動作が自然に実現されています。
まとめ
--silent オプションの追加は小さな変更ですが、CI/CD パイプラインや複数プロセス混在の開発環境における Tailwind CLI の使い勝手を大きく改善します。エラー出力の完全性を保ちながら通常ログを無音化できるこの設計は、既存のエラーパスに一切手を加えることなく、インライン条件式の最小限の追加だけで実現されています。