`--silent` オプションで CLIの非エラー出力を抑制

tailwindlabs/tailwindcss

@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.tsoptions() 関数に --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 intailwindcss v も出力に含まれないことを確認しつつ、CSS の生成物が同一であることも検証しています。

設計判断

オプション名は当初 --quiet が提案されましたが、最終的に --silent が採用されました。PR の元の投稿では --quiet が提案されていましたが、メンテナーによって --silent に変更されています。

実装は既存の eprintln 呼び出しをインラインの条件式でガードするシンプルな変更です。新たな抽象レイヤーを設けず、最小限の変更でフラグのセマンティクスを実現しています。エラーパスを意図的に変更しないことで、「静かに成功し、しっかり失敗を伝える」という CLIツールとして望ましい動作が自然に実現されています。

まとめ

--silent オプションの追加は小さな変更ですが、CI/CD パイプラインや複数プロセス混在の開発環境における Tailwind CLI の使い勝手を大きく改善します。エラー出力の完全性を保ちながら通常ログを無音化できるこの設計は、既存のエラーパスに一切手を加えることなく、インライン条件式の最小限の追加だけで実現されています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
9a801424

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)→背景・技術詳細・設計判断(各論)→まとめ(結論)の3部構成が明確に守られています。各セクションが論理的に配置されており、非常に理解しやすいです。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(```typescript:path/to/file.ts)とGitHubのIssueリンク記法([#8050](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

stderr、ビルドシステム、foremanといった用語を前提としており、専門知識を持つエンジニアという対象読者に適切です。冗長な説明がなく、簡潔にまとめられています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクション、各パラグラフが「総論→各論」の構造で書かれています。また、各段落はトピックセンテンスで始まり、1段落1トピックの原則が守られており、可読性が高いです。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内のコードスニペットは、提供されたDiff情報と正確に一致しています。`if (!args['--silent'])` の追加という変更の核心が的確に示されています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

`@tailwindcss/cli`, `--silent`, `stderr`, RushJS など、使用されている技術用語はすべて正確で、文脈に適しています。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

「非エラー出力を抑制しつつ、エラーメッセージは引き続きstderrに出力される」という説明は、Diffでエラー処理パスが変更されていないことから技術的に正確です。テストに関する説明もDiff内容と整合しています。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内の主張はすべてPR Description、関連Issue(#8050)、またはDiffから裏付けが取れます。特に、`--quiet`から`--silent`への変更経緯についても言及しており、PRの文脈を深く捉えています。ハルシネーションは見られません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#20100)とIssue番号(#8050)が正確に記載されています。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトル「`--silent` オプションで CLIの非エラー出力を抑制」は、PRのタイトルと内容を正確に要約しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事には、PR情報に基づかないバージョンサポート状況やリリース予定などの外部知識は含まれておらず、事実に忠実です。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

記事内には不正確な時間表現や、PRの事実を歪曲するような記述は見られません。