Xcode 的插件大大丰富了 Xcode 的功能,并且有了 Alcatraz ,插件的管理也很是容易,像我这种 Vim 党彻底离不开 XVim。可是有个很是恼人的问题:一旦升级 Xcode ,插件就失效!程序员
以前 Xcode 升级到6.2的时候遇到过插件失效的问题,Google 以后把一段很长命令复制到 Terminal 后运行一下便可,当时一看解决了,顿时以为知足感爆棚,本身能够拯救地球了~就没有再深刻,结果升级到6.3时又遇到了。“一样的招式对圣斗士是不能使用第二次的!”,一样的坑对有节操的程序员是不能掉进去第二次的!所以这一次必定要搞清楚为何会这样,之后再次遇到了如何解决。github
Xcode 的插件放置在 ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins
目录下,为 .xcplugin 格式。经过 Show Content 能够看到 xcplugin 中存在一个 Info.plist,其中有一项为 DVTPlugInCompatibilityUUIDs,而这就是插件失效的缘由。数组
因为 Apple 没有公开插件开发的相关资料,这里我只能经过命名跟值猜想 DVTPlugInCompatibilityUUIDs 的做用:插件经过 DVTPlugInCompatibilityUUIDs 来指定可以运行此插件的 Xcode 版本。所以,DVTPlugInCompatibilityUUIDs 中存放的是 Xcode 版本对应的 UUID,Xcode 在启动加载控件时,将当前 UUID 同插件 Info.plist 中 DVTPlugInCompatibilityUUIDs 存放的 UUID 数组进行匹配,若是没有匹配项,说明此插件没法在该版本的 Xcode 运行,插件也就失效了。app
解决办法很是简单:将当前版本的 UUID 加到 DVTPlugInCompatibilityUUIDs 中便可。可是插件比较多(1个及以上)的状况下,一个个的打开修改很是无聊跟低效,做为“懒惰”的程序员,这时候就要用上命令行,让重复劳动自动化。思路为将命令分为两部分:ui
find
命令在插件目录下找到全部插件的 Info.plist 文件。xargs
命令对上一步的搜索结果进行“for 循环”(就这样理解吧),针对每个 Info.plist 文件,利用 defaults write
命令将当前版本的 UUID 加到 DVTPlugInCompatibilityUUIDs 中。此时问题来了,挖掘机技术。。。不对,是如何获取当前版本 Xcode 的 UUID 呢?首先关掉 Xcode,打开 Terminal,输入 tail -f /var/log/system.log
,再次打开 Xcode,就能看到以下 log 信息:spa
[MT] PluginLoading: Required plug-in compatibility UUID 9F75337B-21B4-4ADC-B558-F9CADF7073A7 for plug-in at path ‘~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin’ not present in DVTPlugInCompatibilityUUIDs插件
能够看到,log 信息代表 Xcode 加载插件失败的缘由,而且可以看到当前版本(6.3)Xcode 的 UUID 为 9F75337B-21B4-4ADC-B558-F9CADF7073A7
。通过 @Kyrrr 的提醒,有一种更好的方式来获取当前版本 Xcode 的 UUID:经过 defaults read
命令从 Xcode 的 Info.plist 读取 DVTPlugInCompatibilityUUID。命令行
最终的命令为:code
1
|
find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth
3 | xargs -I{} defaults write {} DVTPlugInCompatibilityUUIDs -array-add `defaults read /Applications/Xcode.app/Contents/Info.plist DVTPlugInCompatibilityUUID`
|
在 Terminal 中运行上述命令就解决了插件失效的问题,在插件 Info.plist 的 DVTPlugInCompatibilityUUIDs 中也能看到新增的 UUID 了。