与传统的 'cocoapods' 方式相比,使用 Swift 包管理器有什么好处?

What are the benefits to using Swift Package Manager over the traditional 'cocoapods' way?

使用 SPM 而不是 cocoapods 依赖管理器有什么好处?

我使用 cocoapods 的时间最长,但我听到很多关于 SPM 的讨论,以及它如何比 cocoapods 更频繁地被使用。

我也知道它不被认为是第三方的,我想知道这方面是否使它更安全? Swift 是否管理 Swift 包管理器本身并扫描恶意软件/类似于网络/后端开发中的节点包管理器的问题?

我已经从 cocoa pods 切换到 Swift 包管理器,这是我的概要和经验:

好的:

添加包很容易。无需维护 Podfile,这很棒。 Xcode 提供了一个很棒的 UI 添加包。 Select 在侧边栏中的项目,select“Swift 包”选项卡,然后单击“+”按钮添加包。

就创作包而言,您不必维护 podspec 文件并发布单独的规范更新。您需要做的就是在 git 或 GitHub 上标记新版本。事实上,一旦编写了 Package.swift,就应该很少需要更改。将此与 .podspec 进行比较,您至少必须为每个版本更新版本号。

有第一方工具很方便。在 CI 环境中无需额外安装。其他贡献者也不需要安装额外的工具。

Xcode 以清晰有序的方式在侧边栏中显示您的依赖项。它甚至会显示软件包的当前版本号,我很感激。

您不必使用 Xcode 工作区,或以其他方式篡改构建过程。 first-party 工具意味着您可以有理由相信一切都将被正确构建和 linked。

没有“黑匣子魔法”。 SwiftPM 和 CocoaPods 一样 open-source。做出贡献可能不会那么容易或那么快,但这是可能的。

使用私有包比使用私有包更容易和简单pods。您不再有维护私有规范回购的负担。相反,您可以直接在 Xcode 中添加来自私有存储库的包,就像 open-source 包一样。如果您在 Xcode 帐户首选项中 sign-in 到 GitHub,则在添加包时,它将列出您帐户和您所属组织的所有回购协议。如果在团队中工作,所有成员都需要访问任何私有包存储库。您还需要在 CI 环境中提供 GitHub 凭据。但是,您可能已经这样做了,因为您的团队很可能正在开发私有的 closed-source 应用程序。 (这基本上是您设置私人规格回购所需要做的。)

Package.resolved 文件存储在您的项目目录中,因此您可以轻松地将其签入源代码管理。

总体而言,开发者体验非常好。在我的使用中,一切都按预期“正常工作”。将依赖项管理集成到 Xcode 中使开发更容易和更简单。

不好的:

CocoaPods 创建的 Pods/ 目录没有等效项。 Checking-in 您的 Pods/ 目录一直是争议的根源,但至少每个人都可以做出选择。使用 SwiftPM,依赖项存储在项目的派生数据目录 (~/Library/Developer/Xcode/DerivedData/...) 的深处。根据您的 Pods/ 偏好,这会很棒或很糟糕。一种解决方法是更改​​ Xcode“位置”首选项以存储 DerivedData/ 相对于您的项目目录。但是,这带来了额外的问题,因为 DerivedData/ 包含的不仅仅是 SwiftPM 依赖项。您将不得不忽略那些额外的文件和目录。不幸的是,这是所有 Xcode 项目的全局设置。

无法更新单个包。一般来说,更新包有点麻烦。您可以通过文件 > Swift 包菜单执行此操作。目前这是“全有或全无”,这并不总是您想要做的。作为解决方法,您可以更新单个包的版本规则。这并不理想。

Package.resolved 文件在您的项目目录中创建,但存储在 MyApp.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved。这不是一个大问题,但最好将它放在项目根目录或其他更明显的位置。

没有自定义包集成方式的灵活性或能力。没有“pre-install”或“post-install”挂钩。使用 Xcode 中的集成时,无法将 link 包指向特定目标(例如,如果您想使用 third-party 测试框架),或者仅将包包含在具体配置(例如,link仅在 DEBUG 中使用调试框架。)如果您维护自己的 Package.swift 文件,则可以指定 test-target 依赖项。但是,对于 Apple-platform 个项目,您仍然需要一个合适的 .xcodeproj。

如上所述,SwiftPM 是 open-source,但上游更改和修复是一个比 community-driven 工具(如 CocoaPods)更慢的过程。 CocoaPods 可以快速发布新版本以进行修复和新功能。

SwiftPM 绑定到 Xcode 发布时间表。您可以使用开发快照,但这有其自身的问题,并且 disadvantages.SwiftPM 目前不支持混合 Objective-C 和 Swift 的库。 SwiftPM 目前不支持捆绑资源,如图像、故事板、设置目录等