Backstage v1.33.0-next.2 变更全解析:动态插件 Logger 选项破坏性重构与 OpenAPI 静态生成体系落地
发布时间:2026/9/12 21:22:40 作者:尧图编辑部 阅读量:1,286

Backstage v1.33.0-next.2 变更全解析动态插件 Logger 选项破坏性重构与 OpenAPI 静态生成体系落地【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage本文基于 Backstage 官方仓库 v1.33.0-next.2 变更日志 逐项拆解该预发布版本的关键变更dynamicPluginsFeatureLoader的 root logger 选项经历了一次破坏性 API 重构CommonJSModuleLoader正式获得resolvePackagePath支持从而解锁动态插件数据库迁移能力同时 OpenAPI 工具链repo-tools 服务端生成 backend-openapi-utils 新路由工厂全面落地。读者读完可掌握这些变更的迁移要点、背后的实现原理以及它们对 Catalog、Search、Events、CLI 等模块的实际影响。版本概览一次以「预发布迭代」为节奏的同步更新v1.33.0-next.2属于 Backstage 发布流程中的-next预发布系列即稳定版 1.33.0 发布前的一个候选快照。该版本对 monorepo 内的数十个backstage/*包进行了同步版本提升其中包含2 个明确的破坏性变更Breaking Changes变更 ID包类型核心内容e939cd7backstage/backend-dynamic-feature-service0.5.0-next.2Minor破坏性dynamicPluginsFeatureLoader的 logger 相关选项transports、level、format收敛到统一的logger选项下bc47b17backstage/cli0.29.0-next.2Minor破坏性ESLint 配置默认忽略所有src/**/generated/**/*.ts生成源码其余均为 Minor新能力或 Patch缺陷修复级别的变化涉及 OpenAPI 静态生成、测试基建、Catalog 处理器、事件总线等多个子系统。破坏性变更一dynamicPluginsFeatureLoader 的 Logger 选项重组变更内容backstage/backend-dynamic-feature-service0.5.0-next.2中dynamicPluginsFeatureLoader与 root logger 行为相关的三个选项transports、level、format不再作为顶层选项传入而是统一收拢到一个名为logger的函数类型选项下。该函数接收一个可选的Config参数返回 logger 选项对象。从仓库源码 features.ts 可以看到新的选项类型定义export type DynamicPluginsFeatureLoaderOptions DynamicPluginsFactoryOptions DynamicPluginsSchemasOptions { logger?: (config?: Config) DynamicPluginsRootLoggerFactoryOptions; };而DynamicPluginsRootLoggerFactoryOptions在 rootLogger.ts 中被定义为export type DynamicPluginsRootLoggerFactoryOptions Omit WinstonLoggerOptions, meta ;即它覆盖了 Winston 除meta由服务内部固定为{ service: backstage }之外的全部配置项包括level、format、transports等。为什么必须破坏变更日志给出了两个硬性理由logger 选项可能需要依赖运行时 Config 才能确定。由于 root logger 是在 backend 启动早期创建的服务部分环境参数如动态插件配置 schema 中声明的新日志级别、脱敏密钥等只有在拿到最终合并后的Config后才能求值因此选项从「静态对象」改为「接收config的函数」为 root auditing service 预留命名空间。当审计服务引入后需要一组与 logger 命名相似但语义不同的选项。若继续把 logger 选项平铺在顶层二者会产生命名冲突统一收敛到logger键下后未来可以对称地提供auditor键。迁移后的用法源码 features.ts 中的官方示例展示了新写法import { createBackend } from backstage/backend-defaults; import { dynamicPluginsFeatureLoader } from backstage/backend-dynamic-feature-service; import { myCustomModuleLoader } from ./myCustomModuleLoader; import { myCustomSchemaLocator } from ./myCustomSchemaLocator; import { myConfiguredLoggerOptions } from ./myConfiguredLoggerOptions; const backend createBackend(); backend.add(dynamicPluginsFeatureLoader({ moduleLoader: myCustomModuleLoader, schemaLocator: myCustomSchemaLocator, logger: (config) myConfiguredLoggerOptions(config), })); backend.start();迁移清单若此前以{ transports, level, format }形式调用dynamicPluginsFeatureLoader需改为{ logger: (config) ({ level, format, transports }) }的形式若不需要自定义 logger直接省略logger选项即可源码中rootLoggerOptions默认为{}见 features.ts。在实现层面dynamicPluginsRootLoggerServiceFactory内部最终通过WinstonLogger.create组装 logger并会基于动态插件 schema 调用createConfigSecretEnumerator为 logger 动态追加密钥脱敏规则见 rootLogger.ts——这也是为什么 logger 选项必须能在拿到 Config 之后求值脱敏规则本身来自运行时配置。破坏性变更之外CommonJSModuleLoader 正式支持 resolvePackagePath同包的 Patch 变更1aeec12对动态插件生态意义重大CommonJSModuleLoader被增强以支持来自后端动态插件的resolvePackagePath调用提供可自定义的包解析能力并将CommonJSModuleLoader本身提升为公开 API。为什么重要使用数据库的动态插件例如带迁移脚本的插件后端几乎必然调用resolvePackagePath来定位migrations目录。但动态插件的包并不位于主 Backstage 应用的标准 node_modules 结构中且可能被重新打包典型地重命名为带-dynamic后缀导致resolvePackagePath无法解析到正确路径——数据库迁移因此系统性失败。从 CommonJSModuleLoader.ts 可见其公开的选项export type CommonJSModuleLoaderOptions { logger: LoggerService; dynamicPluginPackageNameSuffixes?: String[]; customResolveDynamicPackage?: ( logger: LoggerService, searchedPackageName: string, scannedPluginManifests: Mapstring, ScannedPluginManifest, ) string | undefined; };实现上该类在bootstrap阶段做了两件事覆写module._nodeModulePaths当解析路径位于动态插件目录内时将 node_modules 搜索路径过滤为「Backstage 根 node_modules 动态插件自身的 node_modules」避免动态插件错误解析到宿主应用的依赖CommonJSModuleLoader.ts覆写module._resolveFilename当检测到来自backstage/backend-plugin-api的package.json解析请求即resolvePackagePath的内部实现路径时先按「包名 -dynamic后缀」在已扫描的插件清单中查找匹配的动态插件包找不到再调用customResolveDynamicPackage兜底CommonJSModuleLoader.ts。这意味着动态插件现在可以像普通插件一样直接依赖resolvePackagePath定位数据库迁移脚本无需再规避该 API。OpenAPI 工具链服务端静态类型生成正式落地v1.33.0-next.2 中 OpenAPI 相关改动横跨三个包构成一条完整的「schema → 类型 → 路由」流水线repo-toolsgenerate --server生成完整 TS 接口backstage/repo-tools0.11.0-next.2变更1440232backstage-repo-tools package schema openapi generate --server现在会为 OpenAPI schema 中的所有 request/response 对象生成完整的 TypeScript 接口。这修复了递归 schema 场景下的边界问题并使生成的客户端与服务端类型保持一致的风格。backend-openapi-utils新增类型化路由工厂backstage/backend-openapi-utils0.3.0-next.2变更1440232新增函数createValidatedOpenApiRouterFromGeneratedEndpointMapT extends EndpointMap( spec: RequiredDoc, options?: { validatorOptions?: PartialParameterstypeof OpenApiValidator[0]; middleware?: RequestHandler[]; }, ): TypedRouterT该函数消费 repo-tools 静态生成的服务端代码直接产出一个带完整请求/响应类型推导的 express 路由。其实现位于 stub.ts底层复用与createValidatedOpenApiRouter相同的createRouterWithValidation校验中间件因此依然保持 OpenAPI 3.1 规范校验与请求体验证能力只是路由类型来源从「spec 推导」变为「生成的 EndpointMap」。内部迁移同步发生作为验证backstage/plugin-catalog-backend1.28.0-next.2与backstage/plugin-search-backend1.7.0-next.2均为39fd704已内部切换到新的生成服务端类型backstage/catalog-client1.8.0-next.1656d1ef则切换到了--client-package生成的客户端代码。也就是说本次发布本身就以「吃自己的狗粮」方式验证了这套静态生成链路生成的代码已进入 Catalog 与 Search 的实际 API 实现。说明backstage-cli package schema openapi generate相关命令的用法在 repo-tools CLI 报告 中有完整说明服务端、客户端生成入口分别对应--server与--client-package标志。测试基建mockServices.database 支持注入自定义 Knex 实例backstage/backend-test-utils1.1.0-next.2变更5064827为后端测试基建带来一个小而实用的能力mockServices.database现在可以接收一个给定的 knex 实例来构造。这对需要精确控制数据库连接的测试场景非常有用——例如针对特定数据库版本、自定义连接配置或已存在的迁移状态编写测试时可以直接复用外部创建的 knex 实例而不再依赖 mock 服务内部默认的数据库初始化逻辑。结合仓库中 TestDatabases.ts 对Knex类型的引用可以看到backend-test-utils 的数据库 mock 体系以 knex 为统一抽象层该变更正是对这一抽象层能力边界的扩展。CLI 与前端工具链变化cli0.29.0-next.2ESLint 默认忽略生成代码破坏性变更bc47b17ESLint 配置现在会忽略所有位于src/**/generated/**/*.ts的生成源码。这直接服务于上文 OpenAPI 静态生成体系——generate --server/--client-package产出的代码不再触发 lint 噪音也意味着生成文件不应再手工编辑应通过重新运行生成命令来更新。其余 CLI 补丁e19c53c修复package start --link标志对react-router与react-router-dom的去重问题e565f73前端构建工具链新增对.webp图片格式的支持。Catalog 数据源增强GitLab 归档仓库与 Google LDAPGitLabincludeArchivedReposbackstage/plugin-catalog-backend-module-gitlab0.5.0-next.2变更1b5fdd9为 GitLab 发现处理器新增配置项includeArchivedRepos允许把已归档的项目也纳入 Catalog。从 GitLabDiscoveryProcessor.ts 可以看到该选项的语义默认值为false而查询 GitLab API 时通过条件展开实现过滤this.includeArchivedRepos options.includeArchivedRepos || false; // ... ...(!this.includeArchivedRepos { archived: false }),即默认只发现未归档项目设置为true后归档项目也会被发现、注册进 Catalog。对应配置示例如下catalog.providers.gitlab下的 discovery 提供者catalog: providers: gitlab: yourProviderId: host: gitlab.example.com group: your-group includeArchivedRepos: true # 将已归档仓库也纳入 Catalog测试侧也已覆盖该行为见 GitLabDiscoveryProcessor.test.ts 中skipForkedReposfalse, includeArchivedReposfalse的默认值断言以及 mocks.ts 中includeArchivedRepos: true的用例。LDAPGoogle LDAP Vendor 支持backstage/plugin-catalog-backend-module-ldap0.10.0-next.2变更415aeb3新增对 Google LDAP 供应商Vendor的支持。从源码 client.ts 可以看到LDAP 客户端会通过检查 RootDSE 特征模式与 schema 中的 Google 专属属性来自动识别 Google LDAP 服务器并切换到GoogleLdapVendor的映射规则从而正确处理 Google 目录中与标准 LDAP 不同的字段映射。事件系统修复订阅清理与轮询放大问题事件Events模块在本次有两个值得关注的补丁backstage/plugin-events-backend0.3.16-next.2b7d0334事件订阅现在会在超过最大存活窗口max age window后被清理。对应实现见 DatabaseEventBusStore.ts 的cleanup()逻辑其测试 DatabaseEventBusStore.test.ts 也验证了「始终清理 max age 窗口之外的事件」的行为backstage/plugin-events-node0.4.5-next.20b57aa1修复了事件总线轮询随时间呈指数级重复放大的问题避免长时间运行后轮询负载失控。其他值得注意的补丁backstage/backend-defaults0.5.3-next.2e30bb46禁用数据库迁移现在会正确读取backend.default.skipMigrations配置值。此前该配置可能在某些路径下不生效升级后若依赖该开关禁用迁移请确认配置键名书写正确backstage/plugin-catalog-import0.12.6-next.2ea5b7f3修复了当catalog-info.yaml包含多个 YAML document多文档流时创建 PR 注册仓库的解析问题backstage/plugin-kubernetes-backend0.19.0-next.2bee9664适配自定义 k8s 集群authProvider实现的config.d.ts类型声明backstage/plugin-scaffolder1.26.3-next.28e4bed4依赖idb-keyval升级至5.1.5backstage/plugin-app-visualizer0.1.12-next.2e586e77为本地开发环境新增devDependency。升级建议与兼容性注意事项优先处理两个破坏性变更检查所有调用dynamicPluginsFeatureLoader(options)的位置将transports/level/format迁移到logger: (config) ({...})下参考 features.ts 示例确认src/**/generated/**/*.ts目录下的文件确实均为生成产物再享受 ESLint 忽略的便利若有手工维护的代码位于该路径请先移出。动态插件数据库用户升级backend-dynamic-feature-service后动态插件中的resolvePackagePath调用尤其是数据库迁移脚本将获得官方支持路径可移除此前为绕过该限制而编写的 workaround如需自定义解析可使用CommonJSModuleLoader公开的dynamicPluginPackageNameSuffixes与customResolveDynamicPackage选项。OpenAPI 体系用户升级后建议重新运行yarn backstage-repo-tools package schema openapi generate以同时刷新--server与--client-package两端的生成代码并切换到新的createValidatedOpenApiRouterFromGeneratedEndpointMap路由工厂以获取完整类型推导。本文所有实现细节均可在仓库对应源码路径中进一步验证完整变更条目请查阅 v1.33.0-next.2 变更日志。【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考