脆弱的硬编码:每增加一个插件都要修改核心代码; 循环依赖风险:插件需要核心的基类,核心又导入插件; ;部署噩梦:即使你不需要 OCR 功能,也得安装所有插件依赖
┌─────────────────────────────────────┐│ 核心引擎 (markitdown) ││ - 定义 DocumentConverter 抽象基类 │ ← 高层模块,只依赖抽象│ - 提供转换器注册表 │└─────────────────────────────────────┘↑│ 实现契约(继承基类)│┌─────────────┴───────────────────────┐│ 插件层 ││ - markitdown-ocr │ ← 低层模块,依赖抽象│ - markitdown-sample-plugin ││ 通过 entry_points 声明:"我实现了 ││ markitdown.converter 契约" │└─────────────────────────────────────┘
[project.entry-points."markitdown.converter"]
ocr_pdf = "markitdown_ocr:OCRPDFConverter"from importlib.metadata import entry_points
for ep in entry_points(group="markitdown.converter"):
converter_class = ep.load() # 动态加载
register(converter_class)核心代码里找不到任何 `import markitdown_ocr` 的痕迹
插件安装后自动生效,无需配置文件
用户可以通过 `pip install markitdown-ocr` 按需启用功能
用户安装:`pip install markitdown markitdown-ocr` 插件注册:OCR 插件在 `site-packages` 下写入 entry point 元数据 核心启动:MarkItDown 扫描 `markitdown.converter` 组 动态加载:发现 OCRPDFConverter,验证它继承自 `DocumentConverter` 优先级排序:根据插件声明的 priority 值决定调用顺序 透明调用:用户执行 `markitdown scan.pdf`,自动匹配到 OCR 转换器
Flask 的蓝图系统:需要手动 `app.register_blueprint()`,仍是显式注册
Jupyter 的 kernel 机制:同样用 entry points,但 MarkItDown 更轻量(无需 JSON spec 文件)
WordPress 插件:PHP 通过文件扫描,性能差且不安全
夜雨聆风