ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Open MCT 开源任务控制框架:从本地构建、插件开发到测试体系的完整指南

2026/9/15 11:47:24 拓冰建站 浏览量
Open MCT 开源任务控制框架:从本地构建、插件开发到测试体系的完整指南 Open MCT 开源任务控制框架从本地构建、插件开发到测试体系的完整指南【免费下载链接】openmctA web based mission control framework.项目地址: https://gitcode.com/GitHub_Trending/ope/openmctOpen MCTOpen Mission Control Technologies是 NASA 艾姆斯研究中心开发的新一代任务控制框架专为桌面与移动设备上的遥测数据可视化而设计已被 NASA 用于航天器任务的数据分析以及实验性漫游车系统的规划与操作。本文以仓库根目录 README.md 为主体骨架结合 API.md、TESTING.md 与 e2e/README.md 以及src/目录下的插件源码系统讲解如何在本机构建运行 Open MCT、理解其领域对象与插件架构、接入遥测数据源以及掌握其覆盖单元、端到端、视觉、性能与安全五个维度的测试体系帮助你快速上手把 Open MCT 作为遥测数据应用的基础平台。项目定位与核心概念Open MCT 是一个可通用化、开源的任务控制框架它既开箱即用又是一个用于构建规划、操作与分析任何产生遥测数据的系统的应用程序基座。其核心设计思想与常见单体监控软件不同主要体现在两点框架而非产品Open MCT 主要作为一个可扩展框架作为依赖被集成到用户自己的插件与打包方案中通常需要配合 Apache、Nginx 之类的 HTTP 服务器对外提供服务。插件化架构整个应用由插件plugin组合而成甚至 Open MCT 自身的大多数核心代码也是以插件形式编写见 src/plugins/plugins.js 中对数十个内置插件的注册与导出。在阅读源码与文档时以下来自 README 术语表的核心概念会反复出现先建立统一认知术语定义plugin插件可移除、可复用的软件元素分组应用本身即由插件组合而成。composition组合就领域对象而言指组成或包含于该对象的其他领域对象集合即树形层级中紧邻其下层的对象集合在模型中以 id 数组描述用于异步取回对应领域对象实例。description描述作为对象属性使用时指对事物的可读描述通常为一句话或短段落。domain object领域对象对用户有意义、在 Open MCT 所支撑工作中独立存在的事物左侧树中的任何条目都是领域对象。identifier标识符由 namespace 与 key 组成的元组共同唯一标识一个领域对象。model模型领域对象的持久化状态是可无损转成 JSON 的 JavaScript 对象不含方法。name名称作为对象属性使用时指事物的可读名称。navigation导航应用当前状态中用户对某个具体领域对象的关注表达点击树中对象即导航到该对象。namespace命名空间用于标识持久化存储的名称一个运行中的 Open MCT 应用可能同时使用多个持久化存储。本地构建与运行 Open MCT环境准备与版本要求构建 Open MCT 需要先安装 Git 与 Node.js。需要注意两点约束仓库 package.json 的engines字段声明了经过测试与支持的 Node 版本当前为node: 24.14.1安装依赖前应核对。官方明确建议以非 root 用户执行安装步骤开发者曾报告过以 root 权限运行会引发问题。项目通过nvm或 Windows 下的nvm-windows在 UNIX、macOS、Windows WSL 等 POSIX 兼容环境中维持统一的 Node/npm 版本根目录的.nvmrc即服务于这一流程。四步启动开发环境克隆源码git clone https://github.com/nasa/openmct.git可选安装正确的 Node 版本nvm install安装开发依赖注意核对package.json的engines字段npm install启动本地开发服务器npm start启动完成后用浏览器访问http://localhost:8080/即可看到运行中的 Open MCT。从 package.json 的scripts可以看到npm start实际执行的是npx webpack serve --config ./.webpack/webpack.dev.mjs即 Open MCT 基于npm与webpack构建使用webpack-dev-server提供开发服务器。[!WARNING]npm start提供的开发服务器仅限开发用途严禁部署到生产环境。API 文档对此有明确警告见 API.md。从源码构建发布产物若需要把 Open MCT 作为依赖集成进自己的应用可在源码目录执行git clone https://github.com/nasa/openmct.git cd openmct npm install npm run build构建产物输出到dist目录可整体拷贝到其他位置使用。dist中包含一个压缩后的openmct.js文件以及 UI 运行所需的 html、css、图片等静态资源。在 package.json 中build脚本定义为npm run build:prod npx tsc即先以生产模式跑 webpack 打包再通过tsc生成 TypeScript 类型声明产物对应dist/types/index.d.ts。供应链安全注意事项[!NOTE] 由于供应链攻击威胁本仓库已启用ignore-scripts。如果将 Open MCT 作为 git 依赖而非 npm 依赖构建需要额外手动执行一次npm run build来构建源码。官方始终鼓励优先使用预构建的 npm 包而非直接从 GitHub 构建。启动一个最小可用的 Open MCT 应用Open MCT 以 UMDUniversal Module Definition模块形式打包既可以通过script标签引入获得全局变量openmct也支持常见的 script loader。以下来自 API.md 的最小 HTML 模板展示了完整启动流程——它假定 Open MCT 已按上文方式安装在openmct子目录下!DOCTYPE html html head titleOpen MCT/title script srcdist/openmct.js/script script openmct.install(openmct.plugins.LocalStorage()); openmct.install(openmct.plugins.MyItems()); openmct.install(openmct.plugins.UTCTimeSystem()); openmct.time.setTimeSystem(utc); openmct.install(openmct.plugins.Espresso()); openmct.start(); /script /head body /body /html其中关键调用语义如下openmct.install(...)安装插件。模板依次安装了 LocalStorage浏览器本地持久化、MyItemsMy Items 根文件夹、UTCTimeSystemUTC 时间系统与 Espresso主题。openmct.time.setTimeSystem(utc)把 UTC 设置为活动时间系统。openmct.start()启动应用并挂载到 DOM。可传入一个元素或选择器字符串作为挂载点不传参时Open MCT 会在body下创建一个div并挂载进去。仓库根目录的 index.html 是官方开发示例展示了更完整的插件组合包括示例数据生成器openmct.plugins.example.Generator()、事件生成器、示例影像、Espresso 主题、时间导体openmct.plugins.Conductor(...)、显示布局、笔记本、LAD 表、图表等大量内置插件并监听DOMContentLoaded后调用openmct.start()。使用 TypeScript 类型Open MCT 自带 TypeScript 声明文件由 JSDoc 注释经tsc生成。在你的应用根目录创建jsconfig.js即可获得代码提示与类型检查{ compilerOptions: { baseUrl: ./, target: es6, checkJs: true, moduleResolution: node, paths: { openmct: [node_modules/openmct/dist/openmct.d.ts] } } }随后即可导入使用import openmct from openmct;需要注意公共 API 的类型化工作仍在持续进行提供的类型声明可能不完整。插件机制扩展 Open MCT 的统一入口定义与安装插件插件是 Open MCT 的扩展单元。调用openmct.install并传入一个安装函数即可注册插件该函数在应用启动时被调用唯一参数是 openmct API 对象openmct.install(function install(openmctAPI) { // Do things here // ... });代码库中的常见写法是定义一个返回安装函数的工厂函数从而允许在引入插件时传入配置参数。例如openmct.install(openmct.plugins.Elasticsearch(http://localhost:8002/openmct));这种工厂函数返回安装函数的模式在 src/plugins/plugins.js 中得到了完整印证——plugins对象导出了 UTCTimeSystem、MyItems、LocalStorage、Espresso、Plot、TelemetryTable、DisplayLayout、FaultManagement、Timeline 等数十个内置插件全部以插件形式挂在openmct.plugins.*命名空间下。以 src/plugins/localStorage/plugin.js 为例其实现就是典型的工厂模式export default function (namespace , storageSpace mct) { return function (openmct) { openmct.objects.addProvider(namespace, new LocalStorageObjectProvider(storageSpace)); }; }外部闭包参数namespace、storageSpace支持配置内部闭包在启动时向对象 API 注册对象提供者。领域对象与标识符领域对象是 Open MCT 中表达领域知识的基本实体太阳能板上的温度传感器、比较所有温度传感器结果的叠加图、航天器的指令字典、字典中的单条指令、My Items 文件夹——这些都是领域对象。领域对象本质上是一个带若干标准属性的 JavaScript 对象例如内置的 My Items 对象{ identifier: { namespace: key: mine } name:My Items, type:folder, location:ROOT, composition: [] }核心属性有两个identifier由namespace与key组成的复合键全局唯一标识该对象key必须在命名空间内唯一。type所有对象都有类型类型用于构建知识本体并提供分组、可视化与数据解释的抽象。注册自定义类型通过类型注册表的addType函数注册自定义类型openmct.types.addType(example.my-type, { name: My Type, description: This is a type that I added!, creatable: true });addType接受两个参数类型标识string建议加命名空间前缀避免冲突类型规格对象支持以下属性属性类型说明namestring类型名称descriptionstring类型的长描述initializefunction初始化新领域对象模型用于设置默认值creatableboolean是否允许用户创建该类型默认false决定是否出现在 Create 菜单cssClassstring应用到该对象每个表现形式的 CSS 类常用于指定图标example/generator/plugin.js是真实示例它用openmct.types.addType(generator, {...})注册了 Sine Wave Generator 类型creatable: true使其可被创建并通过form数组定义了 Period、Amplitude、Offset、Data Rate 等可编辑参数initialize函数为新建对象写入默认遥测配置。根对象、对象提供者与组合提供者根对象通过对象 API 的addRoot方法把某个对象或对象层级暴露到应用顶层左侧树openmct.objects.addRoot({ namespace: example.namespace, key: my-key }, openmct.priority.HIGH);addRoot的第一个参数可以是单个标识符、标识符数组或返回标识符/标识符数组 Promise 的函数第二个参数是优先级如openmct.priority.HIGH。使用getAll方法时根对象按优先级顺序返回openmct.objects.addRoot(identifier, openmct.priority.LOW); // low -1000出现在树的最下方 openmct.objects.addRoot(otherIdentifier, openmct.priority.HIGH); // high 1000出现在树的最上方根对象与其他对象一样通过对象提供者加载。对象提供者用于构建领域对象通常从持久化存储或遥测字典等数据源取回。注册方式openmct.objects.addProvider(example.namespace, { get: function (identifier) { return Promise.resolve({ identifier: identifier, name: Example Object, type: example-object-type }); } });addProvider接受两个参数namespace该提供者服务的命名空间字符串与provider含单一get函数的对象。get接收标识符返回解析为所请求对象的 Promise。组合提供者用于动态提供某对象或某类型对象的组合内容典型场景是根据遥测字典填充自定义根对象下的层级openmct.composition.addProvider({ appliesTo: function (domainObject) { return domainObject.type example.my-type; }, load: function (domainObject) { return Promise.resolve(myDomainObjects); } });组合提供者暴露两个函数appliesTo接收领域对象返回布尔值判断是否适用于该对象与load接收领域对象返回解析为标识符数组的 Promise随后由对象提供者据此取回领域对象。默认组合提供者适用于任何带composition属性的领域对象composition的值为标识符数组var domainObject { name: My Object, type: folder, composition: [ { id: 412229c3-922c-444b-8624-736d85516247, namespace: foo }, { key: d6e0ce02-5b85-4e55-8006-a8a505b64c75, namespace: foo } ] };接入遥测数据源Telemetry API 实战Telemetry API 提供两组接口一组用于把遥测数据集成进 Open MCT另一组用于开发基于遥测 API 的可视化插件。前者已稳定并有完整文档后者仍在演进中。集成遥测源包含两大任务描述遥测对象与元数据通过对象提供者提供带遥测元数据的对象或注册遥测元数据提供者为对象提供遥测数据注册遥测提供者取回数据。遥测元数据Telemetry Metadata遥测对象是带telemetry属性的领域对象。以下来自 API.md 的示例描述了航天器 fuel 测量{ identifier: { namespace: example.taxonomy, key: prop.fuel }, name: Fuel, type: example.telemetry, telemetry: { values: [ { key: value, name: Value, unit: kilograms, format: float, min: 0, max: 100, hints: { range: 1 } }, { key: utc, source: timestamp, name: Timestamp, format: utc, hints: { domain: 1 } } ] } }其中telemetry.values是最重要的部分它描述遥测提供者返回的遥测 datum 的属性是遥测视图正常工作的前提。值描述对象支持以下字段属性类型标志说明keystring必填该字段的唯一标识符hintsobject必填让视图智能选择相关属性用于展示多数视图依赖它namestring可选人类可读标签省略时默认为keysourcestring可选datum 中存储该值的属性名省略时默认为keyformatstring可选映射到格式化器的标识枚举用enum时间戳用utc数组用number[]/string[]unitstring可选值的单位如km、seconds、parsecsminnumber可选测量最小值供曲线、仪表等自动设置下限maxnumber可选测量最大值供曲线、仪表等自动设置上限enumerationsarray可选format为enum时枚举所有可能取值如{value: 0, string: OFF}使用后min/max自动设置arraysstring可选format为number[]/string[]时指示按数组解析值提示Value Hintshints 对象中键表示提示本身值表示权重权重越小优先级越高。已知提示包括domain作为曲线 x 轴表格中排在最前渲染range作为曲线 y 轴表格中在 domain 列之后渲染image值可解释为图片文件 URL会启用相应视图imageDownloadName值可解释为图片文件名。时间导体与遥测为让时间导体工作总存在一个活动时间系统所有遥测元数据必须有一个key与活动时间系统key匹配的遥测值可通过source属性把它重映射到遥测 datum 中的不同字段便于适配不同数据源的字段命名。遥测提供者Telemetry Providers遥测提供者负责为遥测对象提供历史与实时数据通过openmct.telemetry.addProvider(provider)注册。一个提供者最多可实现四个方法supportsSubscribe(domainObject, callback, options)可选返回true表示支持实时订阅subscribe(domainObject, callback, options)supportsSubscribe实现时必填建立实时数据订阅每收到一条数据调用一次callback必须返回一个新的退订函数多个视图可订阅同一对象supportsRequest(domainObject, options)可选返回true表示支持历史数据请求request(domainObject, options)supportsRequest实现时必填返回解析为遥测 datum 数组的 Promiseoptions含start、end、domain三个查询边界属性supportsMetadata(domainObject)可选为对象提供动态元数据getMetadata(domainObject)supportsMetadata实现时必填返回至少含一个值元数据定义的合法遥测元数据定义supportsLimits(domainObject)可选为领域对象提供限值评估器getLimitEvaluator(domainObject)supportsLimits实现时必填返回合法的 LimitEvaluator。最小示例openmct.telemetry.addProvider({ supportsRequest: function (domainObject, options) { /*...*/ }, request: function (domainObject, options) { /*...*/ }, })仓库中的 example/generator/plugin.js 是完整的遥测提供者注册范例它同时注册了GeneratorProvider正弦波流式遥测、GeneratorMetadataProvider元数据、SinewaveLimitProvider限值与SinewaveStalenessProvider陈旧度并在插件内定义对象类型与表单配置——这正是用插件把类型、元数据、数据源封装为一个整体的参考实现。测试体系五类自动化测试与质量保障Open MCT 的自动化测试覆盖五种类型单元unit、端到端e2e、视觉visual、性能performance与安全security测试全部命令均记录于 package.json 的scripts中。单元测试Jasmine Karma单元测试使用 Jasmine 编写、由 Karma 运行执行命令npm test测试套件配置为加载src层级下所有以Spec.js结尾的脚本完整配置见 karma.conf.cjs。按约定单元测试脚本与被测单元同目录存放例如src/foo/Bar.js由src/foo/BarSpec.js测试。npm run test:debug即KARMA_DEBUGtrue karma start karma.conf.cjs可在活动 Chrome 会话中实时调试测试。TESTING.md 还给出了单元测试规范要点插件测试应以安装该插件为起点再验证行为测试变量应声明在块级作用域并在beforeEach中初始化优先于beforeAll以避免状态泄漏用afterEach/afterAll做清理例如使用 src/utils/testing.js 提供的工具函数重置 URL 与清理内置 spy。e2e、视觉与性能测试Playwrighte2e、视觉与性能测试统一基于 Playwright 框架使用其测试运行器playwright/test执行。所有测试位于e2e/tests/目录按文件名模式区分功能测试*.e2e.spec.js、视觉测试*.visual.spec.js、性能测试*.perf.spec.js。运行方式# e2e 测试每次提交都会运行 npm run test:e2e:ci # 视觉测试套件 npm run test:e2e:visual # 性能测试 npm run test:perf从 package.json 可看到更细分的命令族test:e2e:local本地 Chrome、test:e2e:mobileiPad/移动端、test:e2e:couchdb持久化数据源、test:e2e:watchwatch 模式 UI 调试、test:e2e:full全量、test:e2e:a11y可访问性、test:perf:contract性能契约与test:perf:memory内存泄漏检测等。e2e 测试的架构细节记录在 e2e/README.md目录结构e2e/helper/存放测试内直接复用的辅助函数e2e/test-data/存放测试数据如ExampleLayouts.json、recycled_local_storage.jsone2e/tests/functional/是功能测试主体e2e/appActions.js提供createDomainObjectWithDefaults()等常用方法帮助测试快速在应用中创建对象。配置模式Playwright 配置文件描述测试在哪里运行包括e2e/playwright-ci.config.jsCI 环境、e2e/playwright-local.config.js本地、e2e/playwright-visual-a11y.config.js视觉与可访问性等。测试标签通过mobile、a11y、addInit、localStorage、snapshot、2p、generatedata、clock、framework等标签组织测试。视觉测试依赖 Percy.io 第三方服务维护基线并做视觉对比没有PERCY_TOKEN时本地运行test:e2e:visual不会做视觉比较。官方推荐视觉测试中把树与检查器隐藏如访问./#/browse/mine?hideTreetruehideInspectortrue并使用固定时间模式控制时间因素。最佳实践以用户视角测试、优先使用page.getByRole()等面向用户的定位器而非 CSS 定位器、用appActions.js完成常见操作、初始导航使用{ waitUntil: domcontentloaded }而非networkidle、可通过storageState生成与加载 localStorage 状态以节省测试运行时间。安全测试CodeQL每次提交都会用 CodeQL 与 docs/src/guide/security.md 提供了安全相关指引。测试报告与覆盖率每个测试套件在 CircleCI 生成报告单元、e2e 与视觉测试运行时产生代码覆盖率合并报告发布到 codecov.io具体配置见 TESTING.md。单元覆盖率由karma-coverage-istanbul-reporter生成到coverage/unite2e 覆盖率先由babel-plugin-istanbul在测试执行期生成再由nyc通过npm run cov:e2e:report转换为 lcov 文件。覆盖率实现存在已知局限如可变性、准确性与 Vue 插桩缺口相关 issue 在 TESTING.md 有记录。兼容性与 v2.0.0 迁移注意事项浏览器与 Node 版本支持Open MCT 在 package.json 的browserslist键中公布了支持的浏览器列表当前包括 Firefox ESR、最新两版 Chrome、iOS Safari 16、Safari 16 等明确排除 IE 11并利用nvm在 UNIX、macOS、Windows WSL 等环境维持一致的 Node/npm 版本。项目演进快速官方只承诺测试并支持browserslist声明范围内的浏览器、操作系统与 NodeJS API。遗留 bundle API 已移除自 Open MCT v2.0.0 起基于 bundle 的遗留 API 及其依赖库如 Angular 1.x已从本仓库完全移除。判断是否仍在用遗留 API可检查源码是否满足以下特征存在名为bundle.js或bundle.json的文件调用了openmct.$injector()或openmct.$angular调用了openmct.legacyRegistry、openmct.legacyExtension或openmct.legacyBundle。仍在使用遗留 API 的应用可借助一个提供引导遗留打包机制与 API 的插件过渡但该插件不会长期维护也不保证与未来版本兼容仅作临时便利。相关资源与延伸阅读Open MCT 虽可独立运行但本质上是一个可扩展框架通常以依赖形式与用户自己的插件和打包方案配合并建议与 Apache 或 Nginx 等 HTTP 服务器一起部署。仓库中值得继续深挖的配套文档与示例包括API.md完整的应用开发参考涵盖对象 API、组合 API、Telemetry API、Time API、Indicators、Priority API、User API 与基于可见性的渲染等主题e2e/README.mde2e 测试的编写、运行与架构详解TESTING.md整体测试流程、单元测试规范与 CI 排障指南docs/src/index.md官方文档入口索引 API 文档与开发流程文档example/generator/plugin.js一个集类型注册、表单配置、遥测提供者注册于一体的完整示例插件src/plugins/plugins.js全部内置插件的一览清单index.html官方开发示例展示了含时间导体配置在内的完整插件组合方式。对于初学者官方还维护了独立的openmct-tutorial入门教程与openmct-quickstartApache YAMCS 遥测 CouchDB 持久化的可运行示例等周边仓库README 中的 Related Repos 一节列出了完整清单可作为从框架走向真实部署的下一步参考。【免费下载链接】openmctA web based mission control framework.项目地址: https://gitcode.com/GitHub_Trending/ope/openmct创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考