Skip to main content

插件模块

后端模块用于扩展插件它们必须始终安装在与其扩展的插件相同的后端实例中,并且只能扩展一个插件。 模块使用扩展点插件注册,同时还能依赖于服务的插件。

模块和插件都会注册一个init方法在启动过程中被调用。 为了确保模块在插件启动前已经注册了它们的所有扩展,每个插件的所有模块都要在插件本身初始化之前完全初始化。 在实际操作中,这意味着由每个init模块的方法需要在插件init方法被调用后,就无法与扩展点进一步交互。init方法已经解决。

模块依赖于目标插件的库包导出的扩展点,例如@backstage/plugin-catalog-node这样做是为了避免直接依赖和可能导致插件包的重复安装,而库包的重复安装应始终得到支持。

实例

下面是一个示例,说明如何使用catalogProcessingExtensionPoint:

// plugins/catalog-backend-module-example-processor/src/module.ts
import { createBackendModule } from '@backstage/backend-plugin-api';
import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node';
import { MyCustomProcessor } from './MyCustomProcessor';

export const catalogModuleExampleCustomProcessor = createBackendModule({
pluginId: 'catalog',
moduleId: 'example-custom-processor',
register(env) {
env.registerInit({
deps: {
catalog: catalogProcessingExtensionPoint,
logger: coreServices.logger,
},
async init({ catalog }) {
catalog.addProcessor(new MyCustomProcessor(logger));
},
});
},
});

请注意,我们将要与之交互的扩展点放在了deps在初始化模块时,我们可以交替依赖扩展点和服务。 如果模块的实现需要,也可以同时依赖多个扩展点。

就像插件一样,每个模块包都应该导出模块实例作为模块包的默认导出:

// plugins/catalog-backend-module-example-processor/src/index.ts
export { catalogModuleExampleCustomProcessor as default } from './module.ts';

这样,只需引用软件包,就能在后端实例中安装模块:

backend.add(
import('backstage-plugin-catalog-backend-module-example-processor'),
);

每个模块包只能包含一个模块,但该模块可以扩展多个扩展点。 模块还可以使用配置来有条件地启用或禁用某些扩展。 这种模式只能用于相互关联的扩展,否则最好创建一个单独的模块包,并配备自己的模块。