如何在Xcode中更新Swift依赖项

67

我创建了一个带有依赖项的新swift包,然后调用swift package generate-xcodeproj。如果我的依赖项有新版本,则会调用swift package update。新版本的依赖项将被下载和构建,但是Xcode现在对旧版本的依赖项存在错误引用。我可以再次调用swift package generate-xcodeproj,但这将删除我设置的任何自定义目标。

如何更新我的swift依赖项和Xcode项目,而不删除我设置的自定义目标?


2
我有同样的问题。生成一个新的 .xcodeproj 的副本也会移除用于组织源文件的任何文件夹结构。 - Craig Otis
2
我建立了一个工具来帮助这个任务。https://github.com/saltzmanjoelh/XcodeHelperCli 完成编译后,将其复制到 /usr/local/bin 或其他路径下即可通过 xchelper update-packages -s 进行调用。这将会更新您的包并为您的 Xcode 项目创建符号链接。这样一来,当您的包有新版本时,就不必手动更新引用了。 - joels
6个回答

80

我刚刚偶然发现了这个问题,并发现“如何在Xcode中更新swift依赖项”的解决方案可能已经改变,因为Swift Packages已经存在几年了。

对我来说,解决方案就是简单地转到文件 -> Swift Packages -> 更新最新的包版本

输入图像描述


3
令我惊讶的是,我的Facebook应用程序7.1.1无法升级到8.0版本。是否还需要进行其他操作? - Zorayr
传递依赖项可能会固定版本@Zorayr。 - Pranav Kasetti
在我的情况下,菜单文件->包被禁用了(Xcode 13.4),还有其他人遇到同样的问题吗? - mojuba

58
许多软件包无法更新的问题是由于Swift软件包版本规则限制了自动软件包更新仅限于当前主版本,例如软件包v3.3.1将升级到v3.4.0,但不会自动更新到v4.0.1。因此,在Xcode中使用更新选项并不一定会获取软件包的最新主要版本。
要解决这个问题,请从项目面板打开项目,选择项目(而不是目标),然后选择“Swift Packages”选项卡。双击要更新的软件包并将最低版本更改为下一个主版本。 输入图像描述

2
这是许多人的答案。我相信如果没有这种干预,软件包管理器将无法获取下一个主要版本。 - smakus
1
这确实是答案。我仍然认为从完全不相关的地方管理软件包是可怕的用户体验。 - Ahmed
对我来说,在完成这个操作后,我还需要执行 文件 -> 包管理器 -> 更新到最新的包版本 - D. Kee
真想不到那个部分竟然隐藏在如此隐蔽的地方。这个截图帮了大忙! - undefined

17

- 使用 Xcode 更新单个依赖项

使用此方法可以节省大量资源和时间。因为它不会强制其他包重新下载。

在你提到的选项卡中双击要更新的包并将其版本更改为任何其他版本,然后它将重新检查远程库。这样做的好处是只更新所选的包。(还有,最好将“当前使用的版本”设置为包中的版本)


- 使用 Xcode 更新所有依赖项

从“文件”菜单 -> “Swift Packages” -> “更新到最新的软件包版本”

SS


使用 GUI 更新单个包(Xcode 12 及以上版本)

从左侧导航窗格右键单击该包并选择“更新包”

Xcode 13

请注意,您将看到 Xcode 显示更新所有软件包,但它将仅更新所选的软件包


1
很遗憾,XCode 12.2 上没有单个软件包更新。 - Edudjr

14

与其试图保存您对生成项目所做的更改,不如像CocoaPods一样在单独的项目中管理依赖项。

开始新项目时:

  1. 为您的应用程序创建Xcode项目MyApp.xcodeproj
  2. 另存为工作区MyApp.xcworkspace
  3. 为您的依赖项创建包
mkdir MyDeps && cd MyDeps
swift package init --type library
  1. Package.swift中添加依赖项。
  2. 为依赖包生成Xcode项目。
swift package generate-xcodeproj
  1. 将生成的项目MyDeps.xcodeproj添加到您的工作区MyApp.xcworkspace
  2. 将目标MyDeps.framework添加到您的应用程序MyApp.xcodeproj的链接框架中

有了这个设置,您可以自由地在Package.swift中更新依赖项,并根据需要重新生成相关项目。


1
我没有尝试过这个,但是这不需要你一次性导入所有依赖项吗? 比如说,你需要执行 import MyDeps,对吧? 然后,所有的依赖项都被导入了? - Vladimir
随着Swift的后续版本,这将会出现一个警告:警告:Xcode可以直接打开和构建Swift Packages。'generate-xcodeproj'不再需要,并且将很快被弃用。 错误:InternalError(description: "内部错误。请在https://bugs.swift.org上报告此信息的错误。插件不受支持") - undefined

4

我在使用Xcode 12.5时遇到了CryptoSwift的问题。我的版本是1.3.1,而问题已在1.4.0中得到修复。 我尝试过:

  1. 通过文件 -> Swift软件包 -> 更新到最新软件包版本来更新。
  2. xcodebuild -resolvePackageDependencies

但两者都没有起作用。

我手动更改了目标 -> Swift软件包 -> 版本规则,Xcode自动安装了更新版本,错误就解决了。


在 Xcode 13.4.1 中,似乎有一个不同的位置 > 项目 > 包依赖项 [版本规则]。 - bshirley

0

如果库被特定目标使用,则该库将不会更新到最新版本,至少在我的情况下(Xcode 14.2)。

我正在使用OneSignal,它需要添加一个目标(OneSignalNotificationServiceExtension),该目标依赖于“框架和库”中的OneSignal库。

所以:

  1. 从扩展中的依赖项中删除所需的库文件,
  2. 通过右键单击- >“更新包”更新库文件
  3. 在“框架和库”中重新添加已更新的库文件到扩展中

截图显示要删除哪一行以使库正确更新(记得稍后阅读)。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接