Xcode 兼容性弃用?
Xcode compatibility deprecation?
我已经 运行 对 Xcode 5.1、6.4、7.0 和各种 macOS 版本进行了多次测试,发现它没有像预期的那样向前兼容,并且没有记录这种行为任何地方据我所知。
Xcode 5.1 最高兼容 OS X 10.11
Xcode 6.4 兼容 macOS 10.12
Xcode 7.0 最高兼容 macOS 10.13
Apple 似乎故意在较新的 macOS 上禁用 Xcode 以强制更新,但我不明白原因。它在 Xcode 的 plist 中也不可见。
这意味着如果我升级我的 OS,我将无法拥有一套固定的开发工具,而我仍然可以 运行 非常旧版本的 Visual Studio 在较新版本的 Windows 上例如。
为什么会这样,是否有关于该行为的任何文档?
Apple 和 Microsoft 在如何处理向前和向后兼容性方面有着截然不同的理念。作为一般规则,近年来 Apple Xcode 环境的每个主要版本都能够 运行ning 仅在与它一起发布的 OS 和一个或两个版本的 mac 上OS 随后(例如,正如您指出的那样,Xcode 7 仍将在 10.13 运行)。
一般来说,如果您要为 macOS(或 iOS)应用程序开发新特性和功能,Apple 鼓励您使用最新的 SDK,然后利用Xcode Deployment Target
机制以及一些 OS 和语言特定的工具,例如 #available
,帮助您编写代码 运行在 OS 的新旧版本上,使用相同的代码库。
您可能同意或不同意这种理念,但这就是 Apple 对其生态系统的看法。
实际上,如果您继续使用旧版 SDK 进行开发(或支持),维护旧版 SDK 的原生构建和测试环境会很有用。这可以在专用硬件上或使用虚拟化工具来完成。但是,在许多情况下,可以通过使用 Deployment Target
设置将代码向前拉到较新版本的工具,从而允许您维护与旧 iOS/macOS 兼容的单一代码库,但是还可以利用新版本中的最新工具和功能。
在我们的案例中,我们倾向于尝试尽快与平台 SDK 一起前进。对于我们的 iOS 工作,这通常意味着每年使用新的 iOS 更新 SDK 版本,从而升级我们的编译器链。对于我们的 macOS 产品,我们保持了与更旧版本的向后兼容性(因为采用新的 macOS 往往比新的 iOS 慢),这意味着我们目前有Xcode 7.x 和 Xcode 9.x 的开发和测试环境。由于 Xcode 7-Xcode 8 时间框架(与 QuickTime 相关)的特定变化,我们不能只使用 Deployment Target
来保持我们最旧的兼容性,而没有更旧的 Xcode。在不久的将来,我们将决定放弃对旧 macOS 版本的支持,转而使用我们的 Xcode 9-only 作为我们的基础。
我已经 运行 对 Xcode 5.1、6.4、7.0 和各种 macOS 版本进行了多次测试,发现它没有像预期的那样向前兼容,并且没有记录这种行为任何地方据我所知。
Xcode 5.1 最高兼容 OS X 10.11
Xcode 6.4 兼容 macOS 10.12
Xcode 7.0 最高兼容 macOS 10.13
Apple 似乎故意在较新的 macOS 上禁用 Xcode 以强制更新,但我不明白原因。它在 Xcode 的 plist 中也不可见。 这意味着如果我升级我的 OS,我将无法拥有一套固定的开发工具,而我仍然可以 运行 非常旧版本的 Visual Studio 在较新版本的 Windows 上例如。
为什么会这样,是否有关于该行为的任何文档?
Apple 和 Microsoft 在如何处理向前和向后兼容性方面有着截然不同的理念。作为一般规则,近年来 Apple Xcode 环境的每个主要版本都能够 运行ning 仅在与它一起发布的 OS 和一个或两个版本的 mac 上OS 随后(例如,正如您指出的那样,Xcode 7 仍将在 10.13 运行)。
一般来说,如果您要为 macOS(或 iOS)应用程序开发新特性和功能,Apple 鼓励您使用最新的 SDK,然后利用Xcode Deployment Target
机制以及一些 OS 和语言特定的工具,例如 #available
,帮助您编写代码 运行在 OS 的新旧版本上,使用相同的代码库。
您可能同意或不同意这种理念,但这就是 Apple 对其生态系统的看法。
实际上,如果您继续使用旧版 SDK 进行开发(或支持),维护旧版 SDK 的原生构建和测试环境会很有用。这可以在专用硬件上或使用虚拟化工具来完成。但是,在许多情况下,可以通过使用 Deployment Target
设置将代码向前拉到较新版本的工具,从而允许您维护与旧 iOS/macOS 兼容的单一代码库,但是还可以利用新版本中的最新工具和功能。
在我们的案例中,我们倾向于尝试尽快与平台 SDK 一起前进。对于我们的 iOS 工作,这通常意味着每年使用新的 iOS 更新 SDK 版本,从而升级我们的编译器链。对于我们的 macOS 产品,我们保持了与更旧版本的向后兼容性(因为采用新的 macOS 往往比新的 iOS 慢),这意味着我们目前有Xcode 7.x 和 Xcode 9.x 的开发和测试环境。由于 Xcode 7-Xcode 8 时间框架(与 QuickTime 相关)的特定变化,我们不能只使用 Deployment Target
来保持我们最旧的兼容性,而没有更旧的 Xcode。在不久的将来,我们将决定放弃对旧 macOS 版本的支持,转而使用我们的 Xcode 9-only 作为我们的基础。