过去 Package.swift 没有好好写,toolchain 版本跟着 Xcode 走,没有兼容不同的版本。最近研究用 SPM 代替 CocoaPods,所以认真的研究折腾了一下。

本文总结把 Package.swift 从 5.9 降至 5.1 过程中遇到的一些问题。

本文不讲解基础语法。

版本号前的空格

之前 5.9 的时候是这么写的:

// swift-tools-version: 5.9

直接将 5.9 改成 5.1 之后报错了:

horizontal whitespace sequence [U+0020] immediately preceding the version specifier is supported by only Swift ≥ 5.4; consider removing the sequence for Swift 5.1

原因是 version:5.1 之间有一个空格。而这个空格是 Swift 5.4 时才支持的特性... 所以改成下面这样就可以了:

// swift-tools-version:5.1
//                    ⬆️注意这里没有空格

参考自:Swift Package Tools Version 的写法

资源的引用

像我一样没有持续关注 SPM 发展的开发者可能不知道,在 SPM 中引用资源是 5.3 开始才支持的特性。

所以如果你的包使用了 Resource bundle 或者 Binary Framework,那么你就不能降至 5.1 了,最低也要 5.3 版本才行。

省略 target.path

我没能找到这个的提案,可能是 Allow sources anywhere in ./Sources when only one target is present 这个。如果哪位明确知道麻烦在评论区告知。

在 5.9 版本上,如果我们的代码都在 Sources 目录下,且只有一个 Target,那么我们可以不显式指定 target.path 属性。

但是在 5.1 版本上不行,所以我们还是需要显式地指定 path 路径。