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 了。