为啥我的 Xcode 插件(如 clang 格式)在更新到新版本的 Xcode 后不再工作了?

Posted

技术标签:

【中文标题】为啥我的 Xcode 插件(如 clang 格式)在更新到新版本的 Xcode 后不再工作了?【英文标题】:Why are my Xcode plugins (such as clang format) installed with Alcatraz no longer working after updating to new version of Xcode?为什么我的 Xcode 插件(如 clang 格式)在更新到新版本的 Xcode 后不再工作了? 【发布时间】:2015-08-02 09:11:11 【问题描述】:

今天我更新到 Xcode 6.3.2,我无法运行 Clang 代码格式化 - 似乎它甚至没有安装。每次我更新 Xcode 时,我都必须重新安装 Alcatraz 和大多数软件包(为什么要顺便说一句?)才能让它们在新版本的 Xcode 上工作。

这次我重新安装了所有软件包(如 VVDocumenter、颜色选择器等),但 ClangFormat 不起作用——它甚至没有出现在“编辑”菜单中。知道为什么吗?

顺便说一句。我试图重新启动 Xcode 以及 Mac 本身:)

编辑(解决方案):

Xcode 6.3.x 的解决方案(如果这不起作用,请使用下面的通用解决方案。)

在终端中,输入以下内容:

find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth 3 | xargs -I defaults write  DVTPlugInCompatibilityUUIDs -array-add 9F75337B-21B4-4ADC-B558-F9CADF7073A7

一般解决方案

通过终端获取新的 UUID:

defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID

将新的 UUID 添加到插件中的 DVTPlugInCompatibilityUUIDs 键(您的 xcplugin 文件 --> 显示包内容 --> Contents/Info.plist

【问题讨论】:

更新 Xcode 后是否也安装了更新后的命令行工具? Xcode 将忽略不宣传与该 Xcode 版本 ID 兼容的插件,因此这可能就是您所看到的。一旦更新了 clang-format 插件,它应该会重新开始工作。 @JonShier 哦,这很有道理。我只是想知道,因为 Alcatraz 看起来(重新)安装包没有问题。 【参考方案1】:

通常,以下方法会有所帮助:Re-install Alcatraz,重新启动 Xcode,卸载并重新安装您的插件。有时重新启动 Xcode 会有所帮助。这对我有用。

如果您的插件仍然没有显示,问题可能是您的新 Xcode 的兼容性密钥尚未包含在插件的兼容性密钥列表中。

可能的解决方案:

等待包含 Xcode 新 UUID 的插件更新 如果您不想等待(例如,如果您安装了 Xcode 的 beta 版本,并且插件更新时间过长),您可以手动将 Xcode 的新 UUID 添加到插件中(详情请参阅如何做到这一点见下文)。当然,不能保证您的插件届时可以工作。如果 Xcode 发生了变化,以至于它真的不再兼容,它当然不会工作。但是,它通常会起作用。

要将新的 UUID 添加到插件中:

如果您使用 Xcode 6.3.2,在终端中输入以下内容:

find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth 3 | xargs -I defaults write  DVTPlugInCompatibilityUUIDs -array-add E969541F-E6F9-4D25-8158-72DC3545A6C6

对于其他版本的 Xcode,通过终端获取 Xcode 的 UUID:defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID,并在上面的find 命令中使用它来更新 UUID。

[除了使用上面的find命令,您还可以手动将新的UUID添加到插件包中的DVTPlugInCompatibilityUUIDs键(您的xcplugin文件-->显示包内容-->Contents/Info.plist )]

来源:GitHub 和“ianmasters”发帖

【讨论】:

我使用了General solution,它非常适合我,谢谢 Xcode 6.3.x 的解决方案似乎仍然可以正常工作 - 使用通用解决方案的第 1 步首先检索要使用的 UUID(例如,6.3.2 是 E969541F-E6F9-4D25-8158-72DC3545A6C6 )。然而,正如下面的答案所述,Xcode 6.4 中的插件加载行为正在发生变化。 我在 Xcode 6.3.2 上尝试过,但它不再启动。堆栈跟踪在崩溃的线程中显示了一些关于 DVT* 的信息。我必须删除 ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins 中的所有 Alcatraz 插件才能重新启动 Xcode。然后,我刚刚重新安装了 Alcatraz,现在我在 Window 菜单下看到了“Package Manager”选项。 @DustinB:你的一个插件可能真的不兼容。 对于鱼,我需要在出现 时加上单引号【参考方案2】:

在终端使用Xcode“所有版本”的通用代码,然后重启Xcode,一切正常:

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

请注意该代码已合并其他答案的代码。

如果你的Xcode版本是6.3.2,上面的代码等于

find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth 3 | xargs -I defaults write  DVTPlugInCompatibilityUUIDs -array-add E969541F-E6F9-4D25-8158-72DC3545A6C6

当你的 Xcode 是 6.3 或 6.3.1 时,等于:

find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth 3 | xargs -I defaults write  DVTPlugInCompatibilityUUIDs -array-add 9F75337B-21B4-4ADC-B558-F9CADF7073A7

你可以发现不同的是最后的代码,是Xcode的uuid,所以我们可以用这个来获取Xcode的新uuid

 defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID

并在该代码的末尾进行更改。

如果还是不行,你可能没有在Alcatraz的alert中选择“load bundle”

如果你选择了“跳过捆绑”,你可以这样做

    reload Alcatraz Alcatraz的提示会再次出现,选择加载包 在热量中使用上面的代码 重新加载 Xcode 成功?!!

编辑: 我试过了,只需要在终端再次使用通用代码,警报会再次显示,选择它就可以了。

【讨论】:

查看接受的答案。您仍然必须检索正确的 UUID。它在 6.3.2 中发生了变化。【参考方案3】:

插件兼容性密钥不适用于 6.3.2 / 6.4.b2

让我们看看这个帖子:https://github.com/omz/Dash-Plugin-for-Xcode/issues/37 - 他们有一个问题和解决方案。

一般总结:XCode确实改变了加载插件的方式(自定义插件先加载),所以需要做一些代码修改。

【讨论】:

【参考方案4】:

尝试从源代码构建而不是使用 curl 命令安装!出于某种原因,我对 curl 命令所做的一切都没有为我工作,包括更改 UUID。所以我从插件文件夹中删除了所有内容并下载了主文件并进行了构建。重新启动 xCode 并接受对话框。也许这会对你有所帮助。

【讨论】:

【参考方案5】:

事实证明,Xcode 现在有一个您启用的捆绑包的白名单/黑名单。您可以通过运行从终端检查它:

$ defaults read com.apple.dt.Xcode DVTPlugInManagerNonApplePlugIns-Xcode-6.3.2

allowed =     
;
skipped =     
    "com.mneorr.Alcatraz" =         
        version = 1;
    ;
    "com.onevcat.VVDocumenter-Xcode" =         
        version = 1;
    ;
    "com.travisjeffery.ClangFormat" =         
        version = 1;
    ;
;

坏消息是,即使您重新安装 Alcatraz,加载包的提示也不会再次显示。修复很简单,只需通过运行删除白名单/黑名单:

defaults delete com.apple.dt.Xcode DVTPlugInManagerNonApplePlugIns-Xcode-6.3.2

然后重新打开 Xcode 以再次得到提示(这次请确保单击“Load Bundles”)。

此处为原帖: Re-enable Alcatraz on Xcode 6.3.2 or newer

【讨论】:

喜欢这个解决方案!对于较新的版本,只需更改末尾的数字(显然)【参考方案6】:

这对我来说从 Xcode 6.3.2 开始就有效

http://pablin.org/2015/05/27/re-enable-alcatraz-on-xcode-6-dot-3-2-or-newer/

【讨论】:

【参考方案7】:

您可以在更新后使用此脚本更新您的 Xcode 插件(适用于 Xcode 7.3):

#!/bin/bash
xcodeUUID=`defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID`
echo $xcodeUUID
find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth 3 | xargs -I defaults write  DVTPlugInCompatibilityUUIDs -array-add $xcodeUUID

或复制我的要点https://gist.github.com/MaciejGad/86302b6b8bdb1ee25115

【讨论】:

这应该被投赞成票。由于它运行良好,无需查找 UUID 编号。干得好。 这应该在 Alcatraz 主页上。【参考方案8】:

安装 Xcode 6.4 后,我选择“Skip Bundles”,找不到 Alcatraz。

首先我尝试添加 UUID,但 Alcatraz 也不起作用;

然后试试这个:

defaults read com.apple.dt.Xcode DVTPlugInManagerNonApplePlugIns-Xcode-6.4 

在 iTerm 中显示如下:

allowed =     
;
skipped =     
    "com.mneorr.Alcatraz" =         
        version = 1;
    ;
;

但是这个文件不能编辑,所以删除:

defaults delete com.apple.dt.Xcode DVTPlugInManagerNonApplePlugIns-Xcode-6.4

接下来,我重新安装 Alcatraz,Xcode 再次显示“Load Bundles”,这次不会出错,选择“Load Bundles”。

【讨论】:

请注意,您不需要重新安装 Alcatraz。只需重置默认设置,您就可以重新开始工作了。 这为我解决了这个问题,因为我选择在更新 XCode 后的某个时间不加载捆绑包,我猜 XCode 通过将 Alcatraz 标记为已跳过来永久保存该选择【参考方案9】:

此脚本会更新插件的 UDID 并确保系统提示您加载包:

#!/bin/bash
xcodeUUID=`defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID`
echo $xcodeUUID
xcodeVersion=`defaults read /Applications/Xcode.app/Contents/Info.plist CFBundleShortVersionString`
echo $xcodeVersion

find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth 3 | xargs -I defaults write  DVTPlugInCompatibilityUUIDs -array-add $xcodeUUID

defaults delete com.apple.dt.Xcode DVTPlugInManagerNonApplePlugIns-Xcode-$xcodeVersion

【讨论】:

以上是关于为啥我的 Xcode 插件(如 clang 格式)在更新到新版本的 Xcode 后不再工作了?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Visual Studio Clang-Format 插件提供 clang 格式文件?

iOS学习使用 Xcode 开发 Clang 插件

Xcode - clang 失败,退出代码 1。插件原因?

在Xcode中使用Clang Format

使用Xcode开发iOS语法检查的Clang插件

为啥 Apple 的 Clang(来自 Xcode 5)为 arm64 制作 typeinfos private_extern?