XVim 安装包工程详解:基于 PackageMaker 文档(pmdoc)为 XVim.xcplugin 制作安装程序

📅 发布时间:2026/10/13 9:39:38
XVim 安装包工程详解:基于 PackageMaker 文档(pmdoc)为 XVim.xcplugin 制作安装程序
开发工具【免费下载链接】XVimXcode plugin for Vim keybindings项目地址https://gitcode.com/gh_mirrors/xv/XVim点击查看免费下载XVim 仓库中的XVim.pmdoc目录是一个 Apple PackageMaker 文档工程用于把构建产物XVim.xcplugin打包成可分发的.pkg安装程序。本文以 XVim.pmdoc/README.md 为主体讲清它的核心前提——如何把 Xcode 构建产物固定到build/Release/XVim.xcplugin——并逐行拆解同目录下的 pmdoc XML 文件、配套 Makefile 与插件Info.plist完整还原“从源码构建到一键安装包”的打包链路。XVim.pmdoc 解决什么问题插件产物位置必须可控XVim.pmdoc/README.md 的核心信息只有一条PackageMaker 工程假定产品即XVim.xcplugin位于build/release/XVim.xcplugin (相对于 pmdoc 目录)但 Xcode 默认的 Build Location 设置会把产物放进 DerivedData 目录该目录位于 XVim 工程目录之外且路径不可控PackageMaker 无法用稳定的相对路径引用它。README 给出的解决方案是通过 Xcode 菜单修改构建位置设置File - Project Settings - Advanced in Build Tab - Select Locations Specified by Targets for Build Location选择Locations Specified by Targets后Xcode 会把构建产物输出到工程目录下的build/configuration/结构对应xcodebuild的默认SYMROOT。随后用release配置构建项目XVim.xcplugin就会落在上述固定位置供 PackageMaker 工程引用。XVim.pmdoc目录本身只有 4 个文件各自承担一个角色文件作用XVim.pmdoc/README.md说明产物位置前提与 Xcode 构建位置设置XVim.pmdoc/index.xmlpkmkdoc根文档包属性、分发选项、安装后动作XVim.pmdoc/01xvim.xmlpkgref子包定义安装来源、安装目标、过滤规则XVim.pmdoc/01xvim-contents.xmlpkg-contents文件清单插件包内部的逐文件快照README 结尾还留有作者的开放问题——希望能“在 Xcode 构建项目时自动生成 XVim 安装包”自动打包。这也提示读者当前工程是手工在 PackageMaker 界面中 Build 的仓库内没有自动化的 pkg 生成脚本。pmdoc 根文档 index.xml安装包属性与安装后动作index.xml 是pkmkdoc格式spec 1.12的根文档关键属性如下pkmkdoc spec1.12 properties titleXVim/title build/Users/shu/Documents/XVim.pkg/build organizationJugglerShu.Net/organization userSees uieasy/ min-target os3/ domain usertrue/ /properties distribution versions min-spec1.000000/ /distribution contents choice titleXVim idchoice0 starts_selectedtrue .../ /contents ... /pkmkdoc逐项解读buildBuild 命令产出的 pkg 文件路径/Users/shu/Documents/XVim.pkg。这是作者本机的绝对路径在其他机器上使用时需要按实际情况调整后文会统一说明这类作者私有路径。userSees uieasy安装向导呈现“简单模式”界面面向普通用户而非开发者细节。min-target os3最低支持目标 OS 版本标识为 3PackageMaker 版本编号实际含义以当时 PackageMaker 约定为准。contents中定义了一个choice安装组件starts_selectedtrue表示默认选中其pkgref idJugglerShu.Net.xvim.XVim.pkg指向01xvim.xml中定义的子包。postinstall定义了一个com.apple.packagemaker.actions.openurl动作值指向项目主页上FeatureList.md的地址对应的仓库内文件是 Documents/Users/FeatureList.md也就是用户安装完成后自动打开 XVim 功能列表页。末尾item typefile01xvim.xml/item声明本包引用的子包定义文件。pkgref 子包 01xvim.xml安装来源、安装目标与过滤规则01xvim.xml 是pkgref格式spec 1.12它回答“装什么、装到哪、怎么装”三个问题pkgref spec1.12 uuid5381CE5D-130F-4FCA-A8DE-64F5EA06F867 config identifierJugglerShu.Net.xvim.XVim.pkg/identifier version0.01/version post-install typenone/ installFrom relativetrue modtrue includeRoottrue build/Release/XVim.xcplugin /installFrom installTo modtrue /Library/Application Support/Developer/Shared/Xcode/Plug-ins /installTo flagsfollowSymbolicLinks//flags packageStore typeinternal/ /config contents file-list01xvim-contents.xml/file-list component idnet.JugglerShu.XVim path/Users/shu/Develop/XVim/build/Release/XVim.xcplugin version1/ filter/CVS$/filter filter/\.svn$/filter filter/\.cvsignore$/filter filter/\.cvspass$/filter filter/\.DS_Store$/filter /contents /pkgrefinstallFrom relativetruebuild/Release/XVim.xcplugin这正是 README 强调的前提——产物必须位于构建位置设定所指目录。这里写的是build/Release大写 R而 README 写的是build/release在 macOS 默认的区分大小写关闭的文件系统下两者等价可以理解为同一目录的不同写法。注意 XML 文件中的路径是Release与实际xcodebuild -configuration Release的输出目录一致。installTo/Library/Application Support/Developer/Shared/Xcode/Plug-insXcode 系统级插件目录。安装该 pkg 后XVim.xcplugin整体放入此目录与 README.md INSTALL 章节中make构建后安装的用户级目录$HOME/Library/Application Support/Developer/Shared/Xcode/Plug-ins见 Makefile 的uninstall目标形成对照——pkg 走系统域make 安装走用户域。includeRoottrue把XVim.xcplugin这个 bundle 目录本身作为整体安装而不是只装它内部的文件保证.xcplugin包结构完整。filter规则逐条过滤/CVS$、/.svn$、/.cvsignore$、/.cvspass$、/.DS_Store$即在打包时排除版本控制残留与 Finder 元数据文件。这与 README.md 的 INSTALL 时代背景一致——仓库使用 SVN/Git 检出后需要清理这些文件。component的path是作者本机绝对路径/Users/shu/Develop/XVim/build/Release/XVim.xcplugin其中还暴露了作者的工程检出目录Develop/XVimidentifiernet.JugglerShu.XVim与 XVim/Info.plist 中CFBundleIdentifier模板net.JugglerShu.${PRODUCT_NAME:rfc1034identifier}展开后的 bundle ID 一致。uuid是 PackageMaker 用来唯一标识该 pkgref 的常量替换安装或升级时依赖它识别同一软件包。pkg-contents 文件清单XVim.xcplugin 的内部结构01xvim-contents.xml 是 PackageMaker 在导入组件时生成的逐文件快照spec 1.12记录了XVim.xcplugin包的结构与每个文件的权限位p为八进制f nXVim.xcplugin oshu gstaff p16877 pt/Users/shu/Develop/XVim/build/Release/XVim.xcplugin mfalse tfile f nContents oshu gstaff p16877 f nInfo.plist oshu gstaff p33188/ f nMacOS oshu gstaff p16877 f nXVim oshu gstaff p33261/ /f f nResources oshu gstaff p16877 f nen.lproj oshu gstaff p16877 f nInfoPlist.strings oshu gstaff p33188/ /f /f /f /f由此可以确认插件 bundle 的标准布局XVim.xcplugin/ └── Contents/ ├── Info.plist # 插件信息字典见下文 ├── MacOS/ │ └── XVim # 可执行体权限 33261 (rwxr-xr-x) └── Resources/ └── en.lproj/ └── InfoPlist.strings # 英文本地化资源权限位16877是目录drwxrwxr-x33188/33261是文件普通文件/可执行文件。对应源码侧XVim/Info.plist 位于 bundle 的Contents/下XVim/en.lproj/InfoPlist.strings 对应Contents/Resources/en.lproj/下的本地化文件与清单完全吻合。pt属性再次出现作者本机路径与component的path同源。插件的兼容性声明DVTPlugInCompatibilityUUIDs 与 Makefile 的 uuid 目标XVim.xcplugin要在 Xcode 中通过插件加载检查必须在 XVim/Info.plist 中声明所兼容的 Xcode 版本 UUID 数组keyDVTPlugInCompatibilityUUIDs/key array string1637F4D5-0B27-416B-A78D-498965D64877/string ... stringCC0D0F4F-05B3-431A-8F33-F84AFCB2C651/string string0420B86A-AA43-4792-9ED0-6FE0F2B16A13/string string7265231C-39B4-402C-89E1-16167C4CC990/string string9AFF134A-08DC-4096-8CEE-62A4BB123046/string stringF41BD31E-2683-44B8-AE7F-5F09E919790E/string stringE71C2CFE-BFD8-4044-8F06-00AE685A406C/string string8A66E736-A720-4B3C-92F1-33D9962C69DF/string stringDA4FDFD8-C509-4D8B-8B55-84A7B66AE701/string stringE0A62D1F-3C18-4D74-BFE5-A4167D643966/string /array每个字符串对应一个 Xcode 版本发行包内Contents/Info中的DVTPlugInCompatibilityUUID。这条机制在 Makefile 的uuid目标中有完整实现它是release/debug构建的前置目标release: uuid逻辑为uuid: xcode_pathxcode-select -p; \ uuiddefaults read $${xcode_path}/../Info DVTPlugInCompatibilityUUID; \ xcode_versiondefaults read $${xcode_path}/../Info CFBundleShortVersionString; \ grep $${uuid} XVim/Info.plist /dev/null ; \ if [ $$? -ne 0 ]; then \ printf XVim hasnt confirmed the compatibility with your Xcode, Version $${xcode_version}\n; \ printf Do you want to compile XVim with support Xcode Version $${xcode_version} at your own risk? (y/N); \ read -r -n 1 in; \ if [[ $$in ! ( $$in y || $$in Y) ]]; then \ plutil -insert DVTPlugInCompatibilityUUIDs.0 -string $${uuid} XVim/Info.plist; \ fi ;\ fi ;流程拆解xcode-select -p取得当前生效的 Xcode/Applications/Xcode.app/Contents/Developer用defaults read从Xcode/Contents/Info读取DVTPlugInCompatibilityUUID与CFBundleShortVersionString用grep检查该 UUID 是否已在XVim/Info.plist的DVTPlugInCompatibilityUUIDs中若不存在打印兼容性未确认警告与 README.md INSTALL 章节描述的控制台提示一致询问用户是否“自担风险”继续用户输入y时用plutil -insert DVTPlugInCompatibilityUUIDs.0把当前 Xcode 的 UUID 插入数组首位使本次构建产物能通过加载检查。此外 Makefile 还定义了build-test目标遍历/Applications/Xcode*.app逐个xcode-select -s切换后重新 make用于验证 XVim 能否在所有本机安装的 Xcode 版本上构建——这正是“多版本 UUID 数组 交互式插入”设计的动机。完整流程从构建到安装包把 README、pmdoc 与 Makefile 串联起来标准操作流程是确认 Xcode 指向xcode-select -p输出/Applications/Xcode.app/Contents/Developer见 README.md INSTALL 第 1 步设置 Xcode 构建位置按 README 要求执行File - Project Settings - Advanced in Build Tab - Locations Specified by Targets保证产物落在build/Release/而非 DerivedData构建 Release 配置make即 Makefile 的release目标展开为xcodebuild -configuration Release。触发 uuid 检查后产物build/Release/XVim.xcplugin生成PackageMaker 打包打开XVim.pmdoc执行 Build按 index.xml 的build属性产出XVim.pkg默认路径/Users/shu/Documents/XVim.pkg需按本机调整分发安装XVim.pkg安装时按 01xvim.xml 的installTo将插件放入/Library/Application Support/Developer/Shared/Xcode/Plug-ins安装完成后自动打开 XVim 功能列表页。与之平行的手动路线不制作 pkg构建后重启 Xcode在加载确认对话框中选择 Yes若误按 No可按 README.md 执行defaults delete com.apple.dt.Xcode DVTPlugInManagerNonApplePlugIns-Xcode-X.X后重启卸载用make uninstall删除用户域下的XVim.xcplugin。适用前提与注意事项PackageMaker 是旧一代工具链pkmkdoc/pkgref/pkg-contents三件套属于 PackageMaker 体系README 末尾“Know better solution?”也表明作者对自动打包并不满意。阅读该工程时应把它当作历史打包方案理解而不是当前 Apple 推荐的 pkg 构建方式。作者私有绝对路径index.xml 的build属性与 01xvim.xml、01xvim-contents.xml 中的组件path都硬编码了作者本机的/Users/shu/...路径跨机器使用 pmdoc 时需自行修正。路径大小写差异README 写build/release/XVim.xcpluginXML 文件写build/Release/XVim.xcplugin二者在不区分大小写的文件系统等价实际以xcodebuild -configuration Release输出的build/Release为准。Xcode 8 时代的加载限制自 Xcode 8 起 Apple 不再直接加载第三方插件需要按 INSTALL_Xcode8.md 对 Xcode 重新签名后XVim.xcplugin无论经 pkg 还是手动安装才能被加载这是使用本安装包流程的适用前提。兼容性检查是交互式的构建前 Makefile 会拦截未确认的 Xcode 版本并要求人工确认见上文uuid目标CI 等无交互环境需要预先在 XVim/Info.plist 中补入对应 UUID。综合来看XVim.pmdoc虽然文件极少但它与 Makefile、XVim/Info.plist共同构成了一条完整证据链README 定下“产物位置可控”这一前提pmdoc 三个 XML 定义“装什么、装到哪”Makefile 的uuid/release目标保证产物能过 Xcode 的版本兼容性检查——三者缺一XVim.pkg的安装包流程无法闭环。赞分享开发工具【免费下载链接】XVimXcode plugin for Vim keybindings项目地址https://gitcode.com/gh_mirrors/xv/XVim点击查看免费下载相关推荐Rust跨平台应用打包基于winit的Windows安装程序制作Rust跨平台应用打包基于winit的Windows安装程序制作 你还在为Rust应用的Windows安装包制作发愁吗当使用winit窗口处理库开发跨平桌面应用跨平台Soundflower安装包制作教程使用installer.rb构建签名安装程序Soundflower安装包制作教程使用installer.rb构建签名安装程序 1. 前言为什么需要自定义安装包 你是否曾为Soundflower在ma驱动开发音视频TiXL 安装程序构建指南基于 Inno Setup 的 Windows 发行包制作全流程TiXL 安装程序构建指南基于 Inno Setup 的 Windows 发行包制作全流程 TiXL 是一个开源的实时动态图形realtime motion音视频图形学桌面应用上一篇融合投影反向优化器(FPBO)Spirula Studio 1080行内核的性能密码下一篇scriptc 标准库支持边界指南Date、URL 与 fs 静态编译能力完整清单创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考