从旧的前台系统迁移实用程序接口
**注意:新的前台系统处于alpha阶段,只有少数插件支持。
如果您要将插件或应用程序从旧的前台系统迁移过来,在实用程序编程接口方面有几件事需要注意。
概览
- 将你的软件仓库整体迁移到最新发布的 backstage * 遵循插件迁移指南 * 可选将你的软件包依赖关系和代码从
core-*-api
改为frontend-*-api
* 保持 TypeScript 接口和 API ref 输出的原样,只是可能要重新考虑后者 ID 的选择 * 使用createApiExtension
将旧的 API 工厂调用包在一个扩展中 * 确保你迁移的插件引用了这个扩展
先决条件
本指南假定您首先升级您的补丁这样,您就不必同时面对几种不兼容和更新。
依赖关系变化
在这篇文章中,我们将讨论一些旧接口,您可以从@backstage/core-plugin-api
包,现在一般都转到@backstage/frontend-plugin-api
的新界面旁边。 如果您愿意,可以更新您的package.json
旧的核心导出在可预见的未来仍将继续使用。
要至少访问新界面,您需要运行以下命令。 请注意,这只是一个示例!它指的是plugins/example
,你必须将其更改为要迁移的软件包所在的实际文件夹名称。
yarn --cwd plugins/example add @backstage/frontend-plugin-api
React 软件包接口和 ref 的更改
让我们从您的导出 TypeScript 接口和 API 引用的行为与旧系统相比没有变化。 通常可以保持原样。 为了说明问题,下面是一个接口及其 API 引用的示例:
import { createApiRef } from '@backstage/frontend-plugin-api';
/**
* Performs some work.
* @public
*/
export interface WorkApi {
doWork(): Promise<void>;
}
/**
* The work interface for the Example plugin.
* @public
*/
export const workApiRef = createApiRef<WorkApi>({
id: 'plugin.example.work',
});
在本例中,插件 ID 已如下所示<!--待办事项:链接-->如果没有,你可以考虑重命名该 ID。 不用担心,这不会影响旧前端系统的用户,因为该 ID 主要用于调试目的。 在新系统中,它更重要,会出现在应用程序配置文件和类似文件中。
请在文件顶部注意,它使用的是更新后的从@backstage/frontend-plugin-api
而不是旧的@backstage/core-plugin-api
.
插件包更改
现在我们来看看主插件包,插件本身就是在这里导出的。 您可能已经有了一个createPlugin
在我们更改core-plugin-api
进口产品看起来会与下面的产品有些相似:
import {
storageApiRef,
createPlugin,
createApiFactory,
} from '@backstage/core-plugin-api';
import { workApiRef } from '@internal/plugin-example-react';
import { WorkImpl } from './WorkImpl';
const exampleWorkApi = createApiFactory({
api: workApiRef,
deps: { storageApi: storageApiRef },
factory: ({ storageApi }) => new WorkImpl({ storageApi }),
});
/** @public */
export const catalogPlugin = createPlugin({
id: 'example',
apis: [exampleWorkApi],
});
我们将做出的主要改变是
- 将现有的 API 工厂封装在
createApiExtension
中 * 改为导出此扩展的新版createPlugin
* 将插件导出改为默认值
在对导入进行简化和清理后,最终结果可能是这样的:
import {
storageApiRef,
createPlugin,
createApiFactory,
createApiExtension,
} from '@backstage/frontend-plugin-api';
import { workApiRef } from '@internal/plugin-example-react';
import { WorkImpl } from './WorkImpl';
const exampleWorkApi = createApiExtension({
factory: createApiFactory({
api: workApiRef,
deps: { storageApi: storageApiRef },
factory: ({ storageApi }) => new WorkImpl({ storageApi }),
}),
});
/** @public */
export default createPlugin({
id: 'example',
extensions: [exampleWorkApi],
});
进一步的工作
由于实用程序编程接口现在已成为完整的扩展,您可能需要更深入地了解它们过去的使用方式,以及新前端系统提供的功能。 例如,您可以考虑增加可配置性或输入到您的应用程序接口,如果这对您当前的应用程序有意义的话。