SuperAPI AI 工具集

capacitor-plugin-spm-support

编程与开发

查看项目

更新于 10-15 15:50

技能介绍

用途:为已有 Capacitor 插件仓库添加 Swift Package Manager(SPM)支持,让使用 CapApp-SPM 的应用可以消费该插件,同时保留 podspec 供 CocoaPods 应用使用。适用于插件仓库含 ios/Plugin/*.swift 与 .m/.h(带 CAP_PLUGIN(...))但根目录没有 Package.swift,或 npx cap sync ios 报插件缺少 Package.swift,或 SPM 应用中 JS 报插件未在 iOS 实现,以及为 Capacitor 9 / CocoaPods Trunk 只读做准备。不适用于应用侧移除 CocoaPods、插件大版本升级、仅 Android 或非 Capacitor 插件。

主要能力与规则:Package.swift 必须位于 npm 包根目录(与 package.json 同级),不能放在 ios/ 下。CLI 在应用的 CapApp-SPM/Package.swift 中以 .package(name: "<Name>", path: ...) 和 .product(name: "<Name>", package: "<Name>") 引用,<Name> 由 npm 名推导:去掉 @,将 / 和 - 转为词边界并 PascalCase,如 @capgo/capacitor-updater 得 CapgoCapacitorUpdater。Package(name:) 与 .library(name:) 必须都等于 <Name>。运行时注册依赖 ios/App/App/capacitor.config.json 的 packageClassList,由扫描 iOS 源码中的 @objc(ClassName) 填充,类上须保留 @objc(<Class>Plugin)。capacitor-swift-pm 依赖须用 from: "<major>.0.0"。Capacitor 9 只依赖 .product(name: "Capacitor", package: "capacitor-swift-pm"),移除无条件 Cordova product。

使用方式:先检查 package.json、podspec、ios/ 下文件与 CAP_PLUGIN 宏,记录 SPM 名称、类名、jsName、方法、部署目标、第三方 pod、资源与 vendored frameworks,并确认第三方 pod 是否有官方 SPM 包。若 iOS 代码除桥接文件外为纯 Swift,可用官方转换器 https://github.com/ionic-team/capacitor-plugin-converter 完成大部分工作,再按规则复核。手动转换需移动源码到 ios/Sources/<ClassName>/、测试到 ios/Tests/<ClassName>Tests/,将类改为继承 CAPPlugin 并实现 CAPBridgedPlugin,声明 identifier、jsName、pluginMethods,删除 .m/.h 桥接与旧工程文件,添加根 Package.swift,更新 podspec 与 package.json 的 files 和 verify:ios。

验证:swift package describe、xcodebuild -scheme <Name> -destination generic/platform=iOS build、npm pack --dry-run 检查 Package.swift 与 ios/Sources、grep 检查残留 CAP_PLUGIN,并在 SPM 示例应用中 npx cap sync ios 后确认无警告、名称出现在 CapApp-SPM/Package.swift 与 packageClassList,构建并调用一个 JS 方法。若仍发布 podspec,运行 pod lib lint。

限制:具体模板、资源与隐私清单、第三方 SPM 依赖、二进制 xcframework、混合 Swift/ObjC 目标、Capacitor 8 与 9 依赖块等细节见 references/package-swift-templates.md,仅在相关主题出现时加载。