Tailwind CSSタスクに `silent` フラグを導入
Tailwind CSS の CLI が新たに --silent オプションを提供したことを受け、tailwindcss-rails のビルド・ウォッチタスクでも同様の無音モードを使えるようにしました。これにより、非エラー出力が抑制され、開発者のログが一層見やすくなります。
背景
Tailwind CSS の出力が大量になるケースでは、ログが埋もれやすくなる問題がありました。--silent フラグは Tailwind Labs が公式に追加した機能で、非エラー情報を抑制します。本 PR はこの公式フラグを Rails のタスクオプションとして露出することを目的としています。
この変更により、Procfile.dev などで bin/rails tailwindcss:watch[silent] と記述でき、Tailwind のバージョンが対応していない場合は自動的に無視されます。結果として、ログのシグナル‑ノイズ比が改善されます。
技術的な変更
タスクオプションの受け取り と CLI へのフラグ渡し を実装しました。まず lib/tailwindcss/commands.rb の compile_command に silent: キーワード引数を追加し、silent が真の場合に --silent をコマンド配列へプッシュします。
def compile_command(debug: false, silent: false, **kwargs)
...
command << "--minify" unless (debug || rails_css_compressor?)
command << "--silent" if silent
...
end
lib/tasks/build.rake でも同様に silent 引数を抽出し、Tailwindcss::Commands.compile_command と Tailwindcss::Commands.watch_command に渡すようにしました。
task build: [:environment, :engines] do |_, args|
debug = args.extras.include?("debug")
silent = args.extras.include?("silent")
verbose = args.extras.include?("verbose")
command = Tailwindcss::Commands.compile_command(debug: debug, silent: silent)
...
end
task watch: [:environment, :engines] do |_, args|
debug = args.extras.include?("debug")
always = args.extras.include?("always")
silent = args.extras.include?("silent")
verbose = args.extras.include?("verbose")
command = Tailwindcss::Commands.watch_command(always: always, debug: debug, silent: silent)
...
end
テストコードも拡充し、silent オプションが正しくコマンドに反映されることを検証しています。test/lib/tailwindcss/commands_test.rb では compile_command(silent: true) と watch_command(silent: true) が --silent を含むことを assert しています。
設計判断
既存のタスクオプション機構(debug, always, verbose)に silent を加える方針を採用しました。新しい設定キーを導入せず、同一の extras 配列で処理できるため、既存の呼び出し側コードに影響を与えません。
この実装は 後方互換性 を重視し、silent が指定されない場合は従来通りの振る舞いを維持します。また、Tailwind CSS のバージョンが --silent をサポートしていない環境でもフラグは単に無視され、タスクはエラーなく実行されます。
まとめ
tailwindcss-rails に silent フラグを導入したことで、Tailwind のビルド・ウォッチタスクが公式の --silent オプションを利用可能になり、ログノイズの低減が実現しました。既存インターフェースとの互換性を保ちつつ、簡潔なオプション指定で機能拡張を提供しています。