.cs-файлов без перезапуска. Это позволяет добавлять собственные модули в папку mods/ и переопределять поведение без пересборки всего решения.
На этой странице описан полный порядок загрузки, формат manifest.json, фильтры SkipModules/LoadModules и таблица всех встроенных модулей.
Динамическая загрузка через Roslyn
Lampac использует Roslyn (CSharpEval) для компиляции модулей при запуске. Все .cs-файлы из module/ и mods/ компилируются динамически. Папки с manifest.json собираются в отдельные сборки, а готовые .dll из references/ подгружаются как части приложения MVC. Эта архитектура позволяет распространять модули в виде исходного кода и пересобирать их на лету.
Порядок загрузки модулей
1
Каталоги mods/ и module/
Сначала обрабатывается каталог
mods/ (пользовательские модули), затем module/ (встроенные модули, включая Online, SISI и Modules).2
Загрузка DLL из references/
Из подкаталога
references/ подгружаются готовые .dll как части приложения MVC. Собственные .dll в корне mods/ / module/ подключаются как сборки модулей.3
Фильтрация по SkipModules и LoadModules
Перед компиляцией применяются фильтры из
init.conf:BaseModule.SkipModules— имена модулей, которые игнорируются полностьюBaseModule.LoadModules— белый список: точное имя, имя группы (OnlineUKR), регулярное выражение ("LME.*") или".*"для загрузки всегоenableвmanifest.json— еслиfalse, модуль пропускается
4
Roslyn-компиляция
Папки с
manifest.json компилируются через Roslyn (CSharpEval.Compilation). В компиляцию включаются ссылки из TPAs и дополнительные DLL.5
Регистрация в DI (IModuleConfigure)
Для каждого скомпилированного модуля вызывается
IModuleConfigure.Configure — модуль регистрирует свои сервисы в контейнере зависимостей.6
Инициализация после старта (IModuleLoaded)
После запуска приложения вызывается
IModuleLoaded.Loaded — модуль может выполнить пост-инициализацию, подписаться на события или запустить фоновые задачи.7
Горячая пересборка (dynamic: true)
Если в
manifest.json указан флаг "dynamic": true, включается watcher. При изменении .cs-файлов модуль пересобирается на лету без перезапуска сервера.Таблица всех модулей
В
example.init.conf (шаблон из репозитория) в SkipModules по умолчанию также указаны: JacRed, Sync, TimeCode, TorrServer. Это означает, что для этих модулей пользователь должен явно убрать их из SkipModules, чтобы они загрузились.Формат manifest.json
Каждый модуль обязан содержатьmanifest.json в корне своего каталога. Минимальный пример для пользовательского модуля:
LoadModules и SkipModules паттерны
ПараметрBaseModule.LoadModules в init.conf задает белый список загружаемых модулей. Поддерживаются несколько форматов записи:
Пример конфигурации в
init.conf:
Часть модулей поставляется с
"enable": false в manifest.json (например, AdminPanel и ExternalBind). Даже если имя модуля присутствует в LoadModules, он не загрузится, пока вы не измените manifest.json или не скопируете модуль в mods/ с исправленным манифестом.Пользовательские модули
Чтобы создать собственный модуль, добавьте каталог вmods/ с manifest.json и .cs-файлами. Roslyn скомпилирует их при запуске. Для включения горячей пересборки установите "dynamic": true.
Modules/*/manifest.json и TestModules/ (последние копируются в mods/ при публикации).