refactor: reorganize package structure and decouple framework packages (#338)
* refactor: reorganize package structure and decouple framework packages ## Package Structure Reorganization - Reorganized 55 packages into categorized subdirectories: - packages/framework/ - Generic framework (Laya/Cocos compatible) - packages/engine/ - ESEngine core modules - packages/rendering/ - Rendering modules (WASM dependent) - packages/physics/ - Physics modules - packages/streaming/ - World streaming - packages/network-ext/ - Network extensions - packages/editor/ - Editor framework and plugins - packages/rust/ - Rust WASM engine - packages/tools/ - Build tools and SDK ## Framework Package Decoupling - Decoupled behavior-tree and blueprint packages from ESEngine dependencies - Created abstracted interfaces (IBTAssetManager, IBehaviorTreeAssetContent) - ESEngine-specific code moved to esengine/ subpath exports - Framework packages now usable with Cocos/Laya without ESEngine ## CI Configuration - Updated CI to only type-check and lint framework packages - Added type-check:framework and lint:framework scripts ## Breaking Changes - Package import paths changed due to directory reorganization - ESEngine integrations now use subpath imports (e.g., '@esengine/behavior-tree/esengine') * fix: update es-engine file path after directory reorganization * docs: update README to focus on framework over engine * ci: only build framework packages, remove Rust/WASM dependencies * fix: remove esengine subpath from behavior-tree and blueprint builds ESEngine integration code will only be available in full engine builds. Framework packages are now purely engine-agnostic. * fix: move network-protocols to framework, build both in CI * fix: update workflow paths from packages/core to packages/framework/core * fix: exclude esengine folder from type-check in behavior-tree and blueprint * fix: update network tsconfig references to new paths * fix: add test:ci:framework to only test framework packages in CI * fix: only build core and math npm packages in CI * fix: exclude test files from CodeQL and fix string escaping security issue
This commit is contained in:
291
packages/engine/engine-core/src/EnginePlugin.ts
Normal file
291
packages/engine/engine-core/src/EnginePlugin.ts
Normal file
@@ -0,0 +1,291 @@
|
||||
/**
|
||||
* 插件系统核心类型定义
|
||||
* Plugin system core type definitions
|
||||
*
|
||||
* 这是运行时插件类型的唯一定义源。
|
||||
* 编辑器类型在 editor-core 中扩展这些类型。
|
||||
*
|
||||
* This is the single source of truth for runtime plugin types.
|
||||
* Editor types extend these in editor-core.
|
||||
*
|
||||
* @see docs/architecture/plugin-system-design.md
|
||||
*/
|
||||
|
||||
import type { IComponentRegistry, IScene, ServiceContainer } from '@esengine/ecs-framework';
|
||||
import { PluginServiceRegistry } from '@esengine/ecs-framework';
|
||||
import { TransformComponent } from './TransformComponent';
|
||||
import type { ModuleManifest } from './ModuleManifest';
|
||||
|
||||
// 导入 engine-core 特有的服务令牌
|
||||
// Import engine-core specific service tokens
|
||||
import {
|
||||
TransformTypeToken,
|
||||
CanvasElementToken,
|
||||
TextureServiceToken,
|
||||
DynamicAtlasServiceToken,
|
||||
CoordinateServiceToken,
|
||||
RenderConfigServiceToken,
|
||||
type ITextureService,
|
||||
type IDynamicAtlasService,
|
||||
type ICoordinateService,
|
||||
type IRenderConfigService
|
||||
} from './PluginServiceRegistry';
|
||||
|
||||
// 导出 engine-core 特有的服务令牌 | Export engine-core specific service tokens
|
||||
export {
|
||||
TransformTypeToken,
|
||||
CanvasElementToken,
|
||||
TextureServiceToken,
|
||||
DynamicAtlasServiceToken,
|
||||
CoordinateServiceToken,
|
||||
RenderConfigServiceToken,
|
||||
type ITextureService,
|
||||
type IDynamicAtlasService,
|
||||
type ICoordinateService,
|
||||
type IRenderConfigService
|
||||
};
|
||||
|
||||
// ============================================================================
|
||||
// 编辑器模块基础接口 | Editor Module Base Interface
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* 编辑器模块基础接口
|
||||
* Base editor module interface
|
||||
*
|
||||
* 定义编辑器模块的核心生命周期方法。
|
||||
* 完整的 IEditorModuleLoader 接口在 editor-core 中扩展此接口。
|
||||
*
|
||||
* Defines core lifecycle methods for editor modules.
|
||||
* Full IEditorModuleLoader interface extends this in editor-core.
|
||||
*/
|
||||
export interface IEditorModuleBase {
|
||||
/**
|
||||
* 安装编辑器模块
|
||||
* Install editor module
|
||||
*/
|
||||
install(services: ServiceContainer): Promise<void>;
|
||||
|
||||
/**
|
||||
* 卸载编辑器模块
|
||||
* Uninstall editor module
|
||||
*/
|
||||
uninstall?(): Promise<void>;
|
||||
|
||||
/**
|
||||
* 编辑器就绪回调
|
||||
* Editor ready callback
|
||||
*/
|
||||
onEditorReady?(): void | Promise<void>;
|
||||
|
||||
/**
|
||||
* 项目打开回调
|
||||
* Project open callback
|
||||
*/
|
||||
onProjectOpen?(projectPath: string): void | Promise<void>;
|
||||
|
||||
/**
|
||||
* 项目关闭回调
|
||||
* Project close callback
|
||||
*/
|
||||
onProjectClose?(): void | Promise<void>;
|
||||
|
||||
/**
|
||||
* 场景加载回调
|
||||
* Scene loaded callback
|
||||
*/
|
||||
onSceneLoaded?(scenePath: string): void;
|
||||
|
||||
/**
|
||||
* 场景保存前回调
|
||||
* Before scene save callback
|
||||
*/
|
||||
onSceneSaving?(scenePath: string): boolean | void;
|
||||
|
||||
/**
|
||||
* 设置语言
|
||||
* Set locale
|
||||
*/
|
||||
setLocale?(locale: string): void;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 加载阶段 | Loading Phase
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* 加载阶段 - 控制插件模块的加载顺序
|
||||
* Loading phase - controls the loading order of plugin modules
|
||||
*/
|
||||
export type LoadingPhase =
|
||||
| 'earliest' // 最早加载(核心模块) | Earliest (core modules)
|
||||
| 'preDefault' // 默认之前 | Before default
|
||||
| 'default' // 默认阶段 | Default phase
|
||||
| 'postDefault' // 默认之后 | After default
|
||||
| 'postEngine'; // 引擎初始化后 | After engine init
|
||||
|
||||
// ============================================================================
|
||||
// 系统上下文 | System Context
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* 系统创建上下文
|
||||
* System creation context
|
||||
*
|
||||
* 包含运行时配置和插件服务注册表。
|
||||
* Contains runtime configuration and plugin service registry.
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* // 导入需要的 Token | Import needed tokens
|
||||
* import { Physics2DQueryToken } from '@esengine/physics-rapier2d';
|
||||
* import { AssetManagerToken } from '@esengine/asset-system';
|
||||
*
|
||||
* // 注册服务 | Register service
|
||||
* context.services.register(Physics2DQueryToken, physicsSystem);
|
||||
*
|
||||
* // 获取服务(可选)| Get service (optional)
|
||||
* const physics = context.services.get(Physics2DQueryToken);
|
||||
*
|
||||
* // 获取服务(必需)| Get service (required)
|
||||
* const physics = context.services.require(Physics2DQueryToken);
|
||||
* ```
|
||||
*/
|
||||
export interface SystemContext {
|
||||
/** 是否为编辑器模式 | Is editor mode */
|
||||
readonly isEditor: boolean;
|
||||
|
||||
/**
|
||||
* 插件服务注册表
|
||||
* Plugin service registry
|
||||
*
|
||||
* 用于跨插件共享服务。
|
||||
* For sharing services between plugins.
|
||||
*/
|
||||
readonly services: PluginServiceRegistry;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 运行时模块 | Runtime Module
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* 运行时模块接口
|
||||
* Runtime module interface
|
||||
*/
|
||||
export interface IRuntimeModule {
|
||||
/**
|
||||
* 注册组件到 ComponentRegistry
|
||||
* Register components to ComponentRegistry
|
||||
*/
|
||||
registerComponents?(registry: IComponentRegistry): void;
|
||||
|
||||
/**
|
||||
* 注册服务到 ServiceContainer
|
||||
* Register services to ServiceContainer
|
||||
*/
|
||||
registerServices?(services: ServiceContainer): void;
|
||||
|
||||
/**
|
||||
* 为场景创建系统
|
||||
* Create systems for scene
|
||||
*/
|
||||
createSystems?(scene: IScene, context: SystemContext): void;
|
||||
|
||||
/**
|
||||
* 所有系统创建完成后调用
|
||||
* Called after all systems are created
|
||||
*/
|
||||
onSystemsCreated?(scene: IScene, context: SystemContext): void;
|
||||
|
||||
/**
|
||||
* 模块初始化完成回调
|
||||
* Module initialization complete callback
|
||||
*/
|
||||
onInitialize?(): Promise<void>;
|
||||
|
||||
/**
|
||||
* 模块销毁回调
|
||||
* Module destroy callback
|
||||
*/
|
||||
onDestroy?(): void;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 插件接口 | Plugin Interface
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* 插件接口
|
||||
* Plugin interface
|
||||
*
|
||||
* 这是所有插件包导出的统一类型。
|
||||
* 使用泛型允许编辑器模块使用更具体的类型。
|
||||
*
|
||||
* This is the unified type that all plugin packages export.
|
||||
* Uses generics to allow editor modules to use more specific types.
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* // 纯运行时插件 | Pure runtime plugin
|
||||
* const MyPlugin: IRuntimePlugin = {
|
||||
* manifest,
|
||||
* runtimeModule: new MyRuntimeModule()
|
||||
* };
|
||||
*
|
||||
* // 编辑器插件(在 editor-core 中定义 IEditorPlugin)
|
||||
* // Editor plugin (IEditorPlugin defined in editor-core)
|
||||
* const MyEditorPlugin: IEditorPlugin = {
|
||||
* manifest,
|
||||
* runtimeModule: new MyRuntimeModule(),
|
||||
* editorModule: new MyEditorModule()
|
||||
* };
|
||||
* ```
|
||||
*/
|
||||
export interface IRuntimePlugin<TEditorModule = unknown> {
|
||||
/** 模块清单 | Module manifest */
|
||||
readonly manifest: ModuleManifest;
|
||||
/** 运行时模块(可选) | Runtime module (optional) */
|
||||
readonly runtimeModule?: IRuntimeModule;
|
||||
/**
|
||||
* 编辑器模块(可选)
|
||||
* Editor module (optional)
|
||||
*
|
||||
* 泛型参数允许 editor-core 使用 IEditorModuleLoader 类型。
|
||||
* Generic parameter allows editor-core to use IEditorModuleLoader type.
|
||||
*/
|
||||
readonly editorModule?: TEditorModule;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Engine Core 插件 | Engine Core Plugin
|
||||
// ============================================================================
|
||||
|
||||
class EngineRuntimeModule implements IRuntimeModule {
|
||||
registerComponents(registry: IComponentRegistry): void {
|
||||
registry.register(TransformComponent);
|
||||
}
|
||||
}
|
||||
|
||||
const manifest: ModuleManifest = {
|
||||
id: 'engine-core',
|
||||
name: '@esengine/engine-core',
|
||||
displayName: 'Engine Core',
|
||||
description: 'Transform 等核心组件',
|
||||
version: '1.0.0',
|
||||
category: 'Core',
|
||||
icon: 'Box',
|
||||
isCore: true,
|
||||
defaultEnabled: true,
|
||||
isEngineModule: true,
|
||||
dependencies: ['core', 'math'],
|
||||
exports: {
|
||||
components: ['TransformComponent', 'HierarchyComponent'],
|
||||
systems: ['TransformSystem', 'HierarchySystem']
|
||||
}
|
||||
};
|
||||
|
||||
export const EnginePlugin: IRuntimePlugin = {
|
||||
manifest,
|
||||
runtimeModule: new EngineRuntimeModule()
|
||||
};
|
||||
Reference in New Issue
Block a user