Xcode升级后插件失效的原理与修复办法

Xcode升级后插件失效的原理与修复办法

Xcode 的插件大大丰富了 Xcode 的功能,而且有了 Alcatraz ,插件的管理也非常容易,像我这种 Vim 党完全离不开 XVim。但是有个非常恼人的问题:一旦升级 Xcode ,插件就失效!

之前 Xcode 升级到6.2的时候遇到过插件失效的问题,Google 之后把一段很长命令复制到 Terminal 后运行一下即可,当时一看解决了,顿时觉得满足感爆棚,自己可以拯救地球了~就没有再深入,结果升级到6.3时又遇到了。“同样的招式对圣斗士是不能使用第二次的!”,同样的坑对有节操的程序员是不能掉进去第二次的!因此这一次一定要搞清楚为什么会这样,以后再次遇到了如何解决。

问题原因

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 运行,插件也就失效了。

解决办法

解决办法非常简单:将当前版本的 UUID 加到 DVTPlugInCompatibilityUUIDs 中即可。但是插件比较多(1个及以上)的情况下,一个个的打开修改非常无聊跟低效,作为“懒惰”的程序员,这时候就要用上命令行,让重复劳动自动化。思路为将命令分为两部分:

  1. 通过 find 命令在插件目录下找到所有插件的 Info.plist 文件。
  2. 通过 xargs 命令对上一步的搜索结果进行“for 循环”(就这样理解吧),针对每一个 Info.plist 文件,利用 defaults write 命令将当前版本的 UUID 加到 DVTPlugInCompatibilityUUIDs 中。

此时问题来了,挖掘机技术。。。不对,是如何获取当前版本 Xcode 的 UUID 呢?首先关掉 Xcode,打开 Terminal,输入 tail -f /var/log/system.log,再次打开 Xcode,就能看到如下 log 信息:

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

最终的命令为:

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


转载于:https://www.cnblogs.com/micalafei/p/4803906.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109334.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Java反射(超详细!)[通俗易懂]

    Java反射(超详细!)[通俗易懂]1、反射机制有什么用?通过java语言中的反射机制可以操作字节码文件(可以读和修改字节码文件。)通过反射机制可以操作代码片段。(class文件。)2、反射机制的相关类在哪个包下?java.lang.reflect.*;3、反射机制相关的重要的类有哪些?类含义java.lang.Class代表整个字节码。代表一个类型,代表整个类。java.lang.reflect.Method代表字节码中的方法字节码。代表类中的方法。java.lang.reflect.Con

  • linux操作系统常用操作命令_运行cmd命令大全

    linux操作系统常用操作命令_运行cmd命令大全一.文件操作命令1.df 显示磁盘使用情况2.du 显示文件系统使用情况3.ls 显示目录普通使用:ls  ls-l  ll查看多个目录:ls/ /ect 查看/和/etc下的文件查看隐藏文件:ls-a 4.cd 切换工作目录切换到根目录:cd/切换到上一级目录:cd..切换到当前用户家目录:cd切换到普…

  • Java Swing 图形界面开发(目录)

    JavaSwing图形界面(GUI)开发基础教程(目录)

  • 77道Spring面试题以及参考答案(2021年最新版)

    77道Spring面试题以及参考答案(2021年最新版)一、Spring概述1.什么是spring?Spring是一个轻量级Java开发框架,最早有RodJohnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEEfull-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。Spring可以做很多事情,它为企

  • 工具类BeanMap,BeanCopier

    工具类BeanMap,BeanCopier对象之间的转换;深度复制;1,BeanMap实现的是Map接口;将对象转换成Map非常简单;2,BeanCopier深度复制;Demo主要类:Test:/***Createdbyadminon2017/3/7.*/publicclassTest{publicstaticvoidmain(String[]args){

  • 2014年度个人年终工作总结

    2014年度个人年终工作总结2014年度个人年终工作总结2014年度过去了,迎来了新的2015年度,总结在过去的一年中的得失,是为了在新的一年中创建更好的工作秩序。2014年的工作主要围绕以下三个技术点进行的:一、delph

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号