如何为Apache Ossie CLI开发一个新转换插件:plugin.yaml详解

发布时间:2026/9/17 20:46:54
如何为Apache Ossie CLI开发一个新转换插件:plugin.yaml详解 如何为Apache Ossie CLI开发一个新转换插件plugin.yaml详解【免费下载链接】ossieApache Ossie, industry wide specification effort to standardize how we exchange semantic metadata across analytics, AI and BI platforms, providing a vendor neutral, single source of truth for semantic data项目地址: https://gitcode.com/GitHub_Trending/osi1/ossieApache Ossie原 Open Semantic Interchange是一个厂商中立的开放规范旨在统一 AI、BI 与数据分析平台之间的语义模型交换。而 Ossie CLI 是它的瑞士军刀通过一个plugin.yaml文件 一个可执行脚本你就能把自己的平台格式dbt、PowerBI……任何格式接入统一转换体系。本文带你完整走一遍Ossie 转换插件开发流程目录结构、每个字段的含义、子进程通信协议最后用一条命令跑通你的第一个插件。一、为什么是插件30 秒理解 Ossie CLI 的架构 Ossie 的核心理念是一份规范、多种工具。CLI 本身不内置任何平台转换逻辑而是通过插件机制动态发现CLI 扫描插件目录下的每个子目录找到其中的plugin.yaml每个合法的plugin.yaml描述一个可执行转换器的调用方式哪个可执行文件、接受什么文件后缀转换时CLI 以子进程方式启动插件通过 stdin/stdout 交换 JSON。这样插件可以用 Python、Go、Rust 等任意语言编写——它只需要读标准输入、写标准输出即可。相关的核心源码都集中在 cli/ 目录插件发现逻辑见 cli/internal/plugin/discover.go子进程调用协议见 cli/internal/plugin/invoke.go。 项目里已有多份参考转换器的实现可以借鉴例如 converters/dbt/、converters/sigma/、converters/snowflake/。二、插件放在哪里一分钟搞定的安装位置 CLI 按以下优先级解析插件目录见 cli/internal/ossiedir/ossiedir.go环境变量OSSIE_PLUGIN_DIR—— 设置后优先生效适合开发期快速切换默认目录~/.ossie/plugins/—— CLI 首次运行时会自动创建。插件的目录约定很简单~/.ossie/plugins/ └── myplatform/ ← 插件子目录每个插件一个目录 ├── plugin.yaml ← 插件描述文件本文主角 ├── my_tool ← 你的转换脚本任意语言、任意名字 └── README.md ← 可选⚠️ 注意发现逻辑会跳过不合法的插件目录并在 stderr 打印warning: skipping plugin at path: reason但不会让整个 CLI 报错cli/internal/plugin/discover.go#L34-L49。所以调试时留意警告信息。三、plugin.yaml 字段逐项详解核心章节下面是一个通过官方测试用例的完整示例取自 cli/internal/plugin/discover_test.go#L14-L25ossie_plugin_spec: 0.1.0 ossie_spec_version: 0.2.0 name: dbt platform: dbt Labs convert: to_ossie: invoke: [ossie-plugin-dbt, to-ossie] accepts: [.yaml, .json] from_ossie: invoke: [ossie-plugin-dbt, from-ossie]3.1 顶层字段速查表字段必填说明ossie_plugin_spec✅本插件遵循的插件规范版本如0.1.0ossie_spec_version✅本插件支持的Ossie 核心规范版本约束支持0.2.0这类写法name✅插件身份标识与convert --from/--to的值精确匹配如dbtplatform⬜面向用户的展示名称如dbt Labs纯展示用途setup⬜相对路径的初始化脚本留空表示无需初始化convert✅双向转换配置见下表字段校验逻辑在 cli/internal/plugin/plugin.go#L52-L68缺任何必填字段都会导致该插件被跳过。3.2 convert两个方向的转换配置字段必填说明convert.to_ossie.invoke✅平台 → Ossie可执行文件 参数数组第一个元素必须是可执行文件名convert.to_ossie.accepts✅接受的输入文件后缀如[.yaml, .json]仅to_ossie方向需要convert.from_ossie.invoke✅Ossie → 平台可执行文件 参数数组两个实用细节invoke中的相对路径以插件目录为工作目录解析cli/internal/plugin/invoke.go#L34-L36所以[my_tool, run]会直接执行插件目录下的my_tool脚本YAML 解析刻意宽容未知字段会被静默忽略而不是报错。这意味着新版规范将来新增字段时旧版 CLI 仍能正常加载你的插件cli/internal/plugin/discover.go#L63-L65。四、插件通信协议stdin 进、stdout 出 插件不需要解析命令行参数CLI 会替你管好一切。一次调用的完整生命周期CLI 向插件 stdin 写入一个 JSON 信封{files: {path/to/input.yaml: 文件内容}}插件执行转换把结果以 JSON 写入 stdout{ files: {path/to/output.yaml: 转换后的内容}, issues: [ {severity: warning, message: 维度 cost_center 未找到映射, path: measures/m_revenue.yaml} ] }约定与坑点对照 cli/internal/plugin/invoke.go 源码severity取值只能是error/warning/infopath可选表示问题所在的具体位置插件退出码必须为 0非零会被 CLI 视为硬错误插件的stderr 会原样透传到 CLI加上--verbose即可看到这是最重要的调试通道响应不是合法 JSON 会直接判失败——请确保 stdout 只输出这一个 JSON 对象日志一律走 stderr。五、动手实践开发你的第一个转换插件 ✅以接入一个假想的acme平台为例三步完成。5.1 第一步准备插件目录与 plugin.yaml把第五节开头的示例改个名字放入~/.ossie/plugins/acme/plugin.yamlossie_plugin_spec: 0.1.0 ossie_spec_version: 0.2.0 name: acme platform: Acme Analytics convert: to_ossie: invoke: [python3, convert.py] accepts: [.yaml] from_ossie: invoke: [python3, convert.py]开发期强烈建议设置OSSIE_PLUGIN_DIR指向项目内的插件目录避免污染~/.ossie/。5.2 第二步编写转换脚本convert.py的全部契约就是读 stdin 的files、做转换、向 stdout 打印filesissues。任何语言都可以仓库里 converters/ 下有十余种语言的现成参考实现。5.3 第三步跑通 convert 命令先构建 CLI在 cli/ 下执行make build见 cli/Makefile然后用--plugin按路径指定插件目录绕过名称发现方便调试cli/cmd/convert.go#L36ossie convert --from acme \ --input model/acme_model.yaml \ --plugin ~/.ossie/plugins/acme \ --verbose常用可调参数一览均在 cli/cmd/convert.go 定义参数默认值作用--timeout60 秒插件调用超时超时会被强制终止--max-input-size100MB输入总量上限大模型可放宽--output/-o./ossie-output/plugin/direction转换结果输出目录--plugin无按 name 发现直接指定插件目录开发期神器-v/--verbose关闭显示插件 stderr 原始输出 小贴士ossie plugin list可以列出当前所有被发现的插件install/remove子命令cli/cmd/plugin/install.go已在路线图上目前版本中直接放置目录即可使用。六、避坑清单新手最常踩的 5 个问题 ️插件没被发现先用ossie plugin list确认找不到时检查必填字段是否齐全注意 stderr 里的warning: skipping plugin会直接告诉你原因name与命令不匹配convert --from的值必须与name完全一致区分大小写stdout 混入了日志Python 的print默认走 stdout调试日志请改用print(..., filesys.stderr)文件后缀漏配to_ossie.accepts没写.json就会拒绝.json输入这是最容易被忽略的必填项相对路径困惑子进程工作目录是插件目录而非你的 shell 目录invoke里写相对路径时以插件目录为基准。七、下一步深入项目 核心规范定义core-spec/spec.md机器可读 schema 在 core-spec/ossie-schema.json完整语义模型示例含 TPC-DS 全模型examples/tpcds_semantic_model.yaml插件单元测试最佳字段参考cli/internal/plugin/discover_test.goCLI 构建与测试cli/Makefile一个plugin.yaml不到 15 行 YAML就能让你的平台接入整个 Ossie 生态。动手试试吧——标准语义模型时代的翻译官正在等你 ✍️【免费下载链接】ossieApache Ossie, industry wide specification effort to standardize how we exchange semantic metadata across analytics, AI and BI platforms, providing a vendor neutral, single source of truth for semantic data项目地址: https://gitcode.com/GitHub_Trending/osi1/ossie创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考