В #38658 компилятор плагина rollup включён по умолчанию, однако плагин может исчезнуть, если его запись в сгенерированном манифесте отсутствует или устарела, например, плагин Chat.
Этот коммит добавляет логику, использующую существующий путь поиска в манифесте для компиляции бандла плагина по требованию в режиме разработки, после чего выполняется повторный поиск. Это предотвращает тихий сбой загрузки плагинов, таких как чат, в локальной разработке после перехода на rollup.
Также добавлен падающий тест для защиты от регрессии.
До:
Даже если плагин включён, в контейнере разработки ничего не происходило.
Ассеты плагинов компилируются автоматически при запуске сервера в режиме разработки. Это строка «[PluginJsWatcher]» в логе, который вы приложили в скриншоте. Мы намеренно спроектировали систему так, чтобы компиляция происходила в фоновом режиме, а не во время обработки веб-запросов.
Многие из нашей команды используют эту систему в разработке уже несколько недель, поэтому проблема, скорее всего, связана с особенностями вашей среды, из-за чего компиляция не удаётся.
Как именно вы запускаете сервер? Установлены ли у вас какие-либо нестандартные переменные окружения?
Я запустил сервер через devcontainer, обновил его из предыдущей версии с помощью git pull, а затем нажал Ctrl+Shift+B для запуска сервера. Однако плагин не компилируется при запуске.
В консоли отображается следующее, но чат так и не компилируется.
Ember CLI запущен с PID: 3456
Запуск наблюдателя за изменениями CSS
[ember-cli] Проксирование на http://127.0.0.1:3000
[ember-cli] сборка...
[ember-cli] ...[BroccoliMergeFiles]
I, [2026-03-20T09:47:37.703686 #3481] INFO -- : прослушивание адреса=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 готов
I, [2026-03-20T09:47:43.340508 #3466] INFO -- : монитор pid=3466 готов
I, [2026-03-20T09:47:43.340654 #3466] INFO -- : процесс монитора готов
I, [2026-03-20T09:47:43.361234 #3481] INFO -- : сервис gen=0 запускается...
I, [2026-03-20T09:47:44.817214 #3481] INFO -- : воркер=0 gen=0 запускается...
[ember-cli] ...[Babel: @embroider/macros > applyPatches]
[ember-cli] ...[Babel: ember-this-fallback > applyPatches]
I, [2026-03-20T09:47:46.412287 #3466] INFO -- : сервис gen=0 pid=4278 запущен
I, [2026-03-20T09:47:46.413532 #4278] INFO -- : запуск 1 контролируемого sidekiq
I, [2026-03-20T09:47:46.716314 #3481] INFO -- : воркер=1 gen=0 запускается...
I, [2026-03-20T09:47:48.556407 #3466] INFO -- : воркер=0 gen=0 pid=4316 зарегистрирован
I, [2026-03-20T09:47:48.610839 #4316] INFO -- : воркер=0 gen=0 pid=4316 готов
I, [2026-03-20T09:47:48.651842 #3481] INFO -- : воркер=2 gen=0 запускается...
I, [2026-03-20T09:47:50.233024 #3466] INFO -- : воркер=1 gen=0 pid=4371 зарегистрирован
I, [2026-03-20T09:47:50.514859 #4371] INFO -- : воркер=1 gen=0 pid=4371 готов
I, [2026-03-20T09:47:50.758417 #4381] INFO -- : Загрузка Sidekiq в процессе id 4381
I, [2026-03-20T09:47:52.373478 #3466] INFO -- : воркер=2 gen=0 pid=4413 зарегистрирован
I, [2026-03-20T09:47:52.452613 #4413] INFO -- : воркер=2 gen=0 pid=4413 готов
[ember-cli] ...[@embroider/compat/app]
запись pid-файла /workspace/discourse/tmp/pids/plugin_js_watcher_0.pid для 4554
I, [2026-03-20T09:47:54.484062 #4554] INFO -- : [PluginJsWatcher] Загрузка PluginJsWatcher в процессе id 4554
[ember-cli] ...[@embroider/webpack]
[Plugin::JsManager] Компиляция 43 плагинов...
[ember-cli] ...[@embroider/webpack]
[ember-cli] ...[@embroider/webpack]
[ember-cli] файл добавлен в список
[ember-cli] ...[@embroider/webpack]
[ember-cli] ...[@embroider/webpack]
[ember-cli] ...[@embroider/webpack]
Поток наблюдателя за JS плагином завершен
/workspace/discourse/lib/asset_processor.rb:169:in 'MiniRacer::Context#call': завершено (MiniRacer::ScriptTerminatedError)
из /workspace/discourse/lib/asset_processor.rb:169:in 'block in AssetProcessor.v8_call'
из /workspace/discourse/lib/asset_processor.rb:168:in 'Thread::Mutex#synchronize'
из /workspace/discourse/lib/asset_processor.rb:168:in 'AssetProcessor.v8_call'
из /workspace/discourse/lib/asset_processor.rb:244:in 'AssetProcessor#rollup'
из /workspace/discourse/lib/plugin/js_compiler.rb:21:in 'Plugin::JsCompiler#compile!'
из /workspace/discourse/lib/plugin/js_manager.rb:132:in 'Plugin::JsManager#compile_js_bundle'
из /workspace/discourse/lib/plugin/js_manager.rb:57:in 'block in Plugin::JsManager#compile!'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:650:in 'Parallel.call_with_index'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:620:in 'Parallel.process_incoming_jobs'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:600:in 'block in Parallel.worker'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:591:in 'Process.fork'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:591:in 'Parallel.worker'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:582:in 'block in Parallel.create_workers'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:581:in 'Array#each'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:581:in 'Enumerable#each_with_index'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:581:in 'Parallel.create_workers'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:520:in 'Parallel.work_in_processes'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:291:in 'Parallel.map'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/parallel-1.27.0/lib/parallel.rb:235:in 'Parallel.each'
из /workspace/discourse/lib/plugin/js_manager.rb:56:in 'Plugin::JsManager#compile!'
из /workspace/discourse/lib/plugin/js_manager.rb:190:in 'Plugin::JsManager#watch'
из /workspace/discourse/lib/demon/plugin_js_watcher.rb:17:in 'Demon::PluginJsWatcher#after_fork'
из /workspace/discourse/lib/demon/base.rb:188:in 'block in Demon::Base#run'
из /workspace/discourse/lib/demon/base.rb:184:in 'Kernel#fork'
из /workspace/discourse/lib/demon/base.rb:184:in 'Demon::Base#run'
из /workspace/discourse/lib/demon/base.rb:177:in 'Demon::Base#start'
из /workspace/discourse/lib/demon/base.rb:30:in 'block in Demon::Base.start'
из <internal:numeric>:257:in 'Integer#times'
из /workspace/discourse/lib/demon/base.rb:30:in 'Demon::Base.start'
из /workspace/discourse/config/pitchfork.conf.rb:126:in 'block in Pitchfork::Configurator#load'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:631:in 'Pitchfork::HttpServer#service_loop'
из /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'
из /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'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:170:in 'block in Pitchfork.clean_fork'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:168:in 'Kernel#catch'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork.rb:168:in 'Pitchfork.clean_fork'
из /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'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/lib/pitchfork/http_server.rb:176:in 'Pitchfork::HttpServer#start'
из /home/discourse/.bundle/gems/ruby/3.4.0/gems/pitchfork-0.18.2/exe/pitchfork:110:in '<top (required)>'
из /workspace/discourse/bin/pitchfork:58:in 'Kernel#load'
из /workspace/discourse/bin/pitchfork:58:in 'block in <main>'
из /workspace/discourse/bin/pitchfork:58:in 'Kernel#fork'
из /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] Сборка успешна (105607 мс) – Сервер работает на http://localhost:4200/
[ember-cli]
[ember-cli] Самые медленные узлы (время >= 5%) | Всего (среднее)
[ember-cli] -+-
[ember-cli] @embroider/webpack (1) | 86394 мс
[ember-cli] @embroider/compat/app (1) | 6764 мс
[ember-cli] Babel: pretty-text (1) | 5364 мс
[ember-cli]
[ember-cli] сборка...
[ember-cli] ...[@embroider/webpack]
[ember-cli]
[ember-cli] Сборка успешна (4541 мс) – Сервер работает на http://localhost:4200/
[ember-cli]
[ember-cli] Самые медленные узлы (время >= 5%) | Всего (среднее)
[ember-cli] -+-
[ember-cli] @embroider/webpack (1) | 2508 мс
[ember-cli] Funnel (179) | 1005 мс (5 мс)
[ember-cli] @embroider/compat/app (1) | 415 мс
[ember-cli] broccoli-persistent-filter:Mapper (3) | 353 мс (117 мс)
[ember-cli]
Похоже, что начальная компиляция чата на вашем компьютере завершается по тайм-ауту. Давайте увеличим этот лимит, чтобы всё работало лучше в менее производительных средах:
Если вы сможете выделить больше ресурсов CPU и памяти в вашей Docker-окружении, это улучшит процесс разработки. Но как минимум это увеличение должно помочь запустить всё корректно.