FIX: 開発時に不足しているrollupプラグインバンドルをオンデマンドでコンパイル

#38658 では、rollup プラグインコンパイラがデフォルトで有効になりますが、生成されたマニフェストエントリが欠落または古い場合、プラグインが消える可能性があります(例:Chat プラグイン)。

このコミットでは、既存のマニフェストルックアップパスを使用して、開発時にオンデマンドでプラグインバンドルをコンパイルし、その後ルックアップを再試行するロジックを追加します。これにより、rollup への切り替え後、Chat のようなプラグインがローカル開発でサイレントにロードに失敗するのを防ぎます。

また、リグレッションを防ぐために失敗する spec が追加されます。


以前:

プラグインが有効になっていても、開発コンテナ内では何も起こりませんでした。

以後:

「いいね!」 2

プラグインのアセットは、開発モードでサーバーを起動すると自動的にコンパイルされます。それがスクリーンショットを撮ったログの「[PluginJsWatcher]」の行です。私たちは意図的に、ウェブリクエスト中にコンパイルが発生するのではなく、バックグラウンドで発生するようにシステムを設計しました。

チームの多くのメンバーがここ数週間、開発でこのシステムを使用しているので、失敗の原因となっているあなたのシステムに何か特有のものがあるはずです。:thinking:

サーバーをどのように起動していますか?何か特異な環境変数(environment variables)を設定していますか?

devcontainer を使用してサーバーを起動し、git pull で以前のバージョンから更新した後、ctrl+shift+b でサーバーを起動しましたが、起動時にプラグインがコンパイルされません。

環境変数は設定されていません。

コンソールで [PluginJsWatcher] の行は表示されましたか? [Plugin::JsManager] Finished initial compilation of plugins in 5.9s のようなものは表示されましたか?

変更前は、いいえ。

サーバーは準備完了で起動しましたが、チャットはコンパイルされていません。

スクリーンレコードをアップロードします。

「いいね!」 1

ビデオが大きすぎるようです。

これを試してください: /app/assets/generated を削除する
コンソールには以下が表示されますが、チャットはコンパイルされません。

Ember CLI running on PID: 3456
Starting CSS change watcher
[ember-cli] Proxying to http://127.0.0.1:3000
[ember-cli] building... 
[ember-cli] ...[BroccoliMergeFiles]
I, [2026-03-20T09:47:37.703686 #3481]  INFO -- : listening on addr=127.0.0.1:3000 fd=38
[ember-cli] ...[ConfigLoader]
[ember-cli] ...[Babel: ember-tracked-storage-polyfill > applyPatches]
[ember-cli] ...[Babel: pretty-text > applyPatches]
I, [2026-03-20T09:47:43.338485 #3466]  INFO -- : mold gen=0 pid=3481 ready
I, [2026-03-20T09:47:43.340508 #3466]  INFO -- : monitor pid=3466 ready
I, [2026-03-20T09:47:43.340654 #3466]  INFO -- : monitor process ready
I, [2026-03-20T09:47:43.361234 #3481]  INFO -- : service gen=0 spawning...
I, [2026-03-20T09:47:44.817214 #3481]  INFO -- : worker=0 gen=0 spawning...
[ember-cli] ...[Babel: @embroider/macros > applyPatches]
[ember-cli] ...[Babel: ember-this-fallback > applyPatches]
I, [2026-03-20T09:47:46.412287 #3466]  INFO -- : service gen=0 pid=4278 spawned
I, [2026-03-20T09:47:46.413532 #4278]  INFO -- : starting 1 supervised sidekiqs
I, [2026-03-20T09:47:46.716314 #3481]  INFO -- : worker=1 gen=0 spawning...
I, [2026-03-20T09:47:48.556407 #3466]  INFO -- : worker=0 gen=0 pid=4316 registered
I, [2026-03-20T09:47:48.610839 #4316]  INFO -- : worker=0 gen=0 pid=4316 ready
I, [2026-03-20T09:47:48.651842 #3481]  INFO -- : worker=2 gen=0 spawning...
I, [2026-03-20T09:47:50.233024 #3466]  INFO -- : worker=1 gen=0 pid=4371 registered
I, [2026-03-20T09:47:50.514859 #4371]  INFO -- : worker=1 gen=0 pid=4371 ready
I, [2026-03-20T09:47:50.758417 #4381]  INFO -- : Loading Sidekiq in process id 4381
I, [2026-03-20T09:47:52.373478 #3466]  INFO -- : worker=2 gen=0 pid=4413 registered
I, [2026-03-20T09:47:52.452613 #4413]  INFO -- : worker=2 gen=0 pid=4413 ready
[ember-cli] ...[@embroider/compat/app]
writing pid file /workspace/discourse/tmp/pids/plugin_js_watcher_0.pid for 4554
I, [2026-03-20T09:47:54.484062 #4554]  INFO -- : [PluginJsWatcher] Loading PluginJsWatcher in process id 4554
[ember-cli] ...[@embroider/webpack]
[Plugin::JsManager] Compiling 43 plugins...
[ember-cli] ...[@embroider/webpack]
[ember-cli] ...[@embroider/webpack]
[ember-cli] file added checklist
[ember-cli] ...[@embroider/webpack]
[ember-cli] ...[@embroider/webpack]
[ember-cli] ...[@embroider/webpack]
Finished Plugin JS watcher thread
/workspace/discourse/lib/asset_processor.rb:169:in 'MiniRacer::Context#call': terminated (MiniRacer::ScriptTerminatedError)
        from /workspace/discourse/lib/asset_processor.rb:169:in 'block in AssetProcessor.v8_call'
        from /workspace/discourse/lib/asset_processor.rb:168:in 'Thread::Mutex#synchronize'
        from /workspace/discourse/lib/asset_processor.rb:168:in 'AssetProcessor.v8_call'
        from /workspace/discourse/lib/asset_processor.rb:244:in 'AssetProcessor#rollup'
        from /workspace/discourse/lib/plugin/js_compiler.rb:21:in 'Plugin::JsCompiler#compile!'
        from /workspace/discourse/lib/plugin/js_manager.rb:132:in 'Plugin::JsManager#compile_js_bundle'
        from /workspace/discourse/lib/plugin/js_manager.rb:57:in 'block in Plugin::JsManager#compile!'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:650:in 'Parallel.call_with_index'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:620:in 'Parallel.process_incoming_jobs'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:600:in 'block in Parallel.worker'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:591:in 'Process.fork'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:591:in 'Parallel.worker'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:582:in 'block in Parallel.create_workers'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:581:in 'Array#each'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:581:in 'Enumerable#each_with_index'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:581:in 'Parallel.create_workers'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:520:in 'Parallel.work_in_processes'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:291:in 'Parallel.map'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:235:in 'Parallel.each'
        from /workspace/discourse/lib/plugin/js_manager.rb:56:in 'Plugin::JsManager#compile!'
        from /workspace/discourse/lib/plugin/js_manager.rb:190:in 'Plugin::JsManager#watch'
        from /workspace/discourse/lib/demon/plugin_js_watcher.rb:17:in 'Demon::PluginJsWatcher#after_fork'
        from /workspace/discourse/lib/demon/base.rb:188:in 'block in Demon::Base#run'
        from /workspace/discourse/lib/demon/base.rb:184:in 'Kernel#fork'
        from /workspace/discourse/lib/demon/base.rb:184:in 'Demon::Base#run'
        from /workspace/discourse/lib/demon/base.rb:177:in 'Demon::Base#start'
        from /workspace/discourse/lib/demon/base.rb:30:in 'block in Demon::Base.start'
        from 内部:257:in 'Integer#times'
        from /workspace/discourse/lib/demon/base.rb:30:in 'Demon::Base.start'
        from /workspace/discourse/config/pitchfork.conf.rb:126:in 'block in Pitchfork::Configurator#load'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:631:in 'Pitchfork::HttpServer#service_loop'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:680:in 'block in Pitchfork::HttpServer#spawn_service'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:1222:in 'block in Pitchfork::HttpServer#fork_sibling'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:170:in 'block in Pitchfork.clean_fork'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:168:in 'Kernel#catch'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:168:in 'Pitchfork.clean_fork'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:690:in 'Pitchfork::HttpServer#spawn_initial_mold'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:176:in 'Pitchfork::HttpServer#start'
        from /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/exe/pitchfork:110:in '<required>'
        from /workspace/discourse/bin/pitchfork:58:in 'Kernel#load'
        from /workspace/discourse/bin/pitchfork:58:in 'block in <main>'
        from /workspace/discourse/bin/pitchfork:58:in 'Kernel#fork'
        from /workspace/discourse/bin/pitchfork:58:in '<main>'
[ember-cli] ...[@embroider/webpack]
[ember-cli] ...[@embroider/webpack]
[ember-cli] ...[@embroider/webpack]
[ember-cli] ...[Babel: discourse > applyPatches]
[ember-cli] 
[ember-cli] Build successful (105607ms) – Serving on http://localhost:4200/
[ember-cli] 
[ember-cli] Slowest Nodes (totalTime >= 5%) | Total (avg)
[ember-cli] -+-
[ember-cli] @embroider/webpack (1) | 86394ms
[ember-cli] @embroider/compat/app (1) | 6764ms
[ember-cli] Babel: pretty-text (1) | 5364ms
[ember-cli] 
[ember-cli] building... 
[ember-cli] ...[@embroider/webpack]
[ember-cli] 
[ember-cli] Build successful (4541ms) – Serving on http://localhost:4200/
[ember-cli] 
[ember-cli] Slowest Nodes (totalTime >= 5%) | Total (avg)
[ember-cli] -+-
[ember-cli] @embroider/webpack (1) | 2508ms
[ember-cli] Funnel (179) | 1005ms (5 ms)
[ember-cli] @embroider/compat/app (1) | 415ms
[ember-cli] broccoli-persistent-filter:Mapper (3) | 353ms (117 ms)
[ember-cli] 

ああ、ありがとう!

チャットの初期コンパイルがあなたのマシンでタイムアウトしているようです。より遅い環境でもうまく機能するように、それを増やしましょう。

Docker環境でより多くのCPU/メモリリソースを利用できるようにすれば、開発体験が向上します。しかし、少なくともこの増加で動作するはずです。

「いいね!」 2