如何在Xcode 11中删除Swift包依赖?

322

我在Xcode 11中有一个项目,添加了Swift Package Manager依赖项。现在我意识到,我不再需要之前添加到我的项目中的某个包依赖项。

如下所示,可以看到在文件 > Swift Packages下没有选项可用于从Swift Package Manager中删除这个项目的包装程序。

Swift Packages Menu Options

我尝试从project.xcworkspace/xcshareddata/swiftpm/Package.resolved文件的数组中删除该包,但它仍然没有从Xcode中删除,下次我执行更新到最新包版本时,它会重新将条目添加到Package.resolved文件中。

如何删除项目中的Swift Package Manager依赖项呢?


2
我无法在Xcode 13中理解任何这个问题的答案。 - John Sorensen
11个回答

741
  1. 打开Xcode
  2. 选择你的项目
  3. 查看顶部中间位置
  4. 选择 Swift 包管理器 菜单

你将能够管理你的包(添加/删除)

enter image description here


31
你可以在侧边栏上右键点击并删除任何你想要的内容!但是这样做是没有任何效果的。 - Clifton Labrum
3
我尝试了上述步骤,但仍然无法移除依赖项! - Peter Schorn
4
我不得不通过谷歌搜索才解决这个愚蠢的问题,这是一个坏苹果。 - Darkwonder
5
更新:在Xcode 13.3中,该选项卡被称为“包依赖性”。 - Hussein
1
谢谢这个。很奇怪苹果让添加和更新软件包变得容易,但却不提供删除的选项? - RobMac
显示剩余4条评论

34

Swift Package Manager(SPM) 依赖

添加依赖

1. Project Settings contains information about dependencies. 
2. File -> Swift Packages -> Add Package Dependency...
3. Target -> General -> Frameworks, Libraries, and Embedded Content -> Add Items -> Add Other... -> Add Package Dependency...

目标设置包括来自依赖项的产品

编辑依赖项

要编辑URL,您可以使用repositoryURL编辑.pbxproj

删除依赖项

Project -> Packages -> <Select dependency> -> -

[本地 Swift Package Manager(SPM)]
[iOS 依赖管理器]


确认这是问题的最直接答案。在Xcode 14中可重现。 - Andre

25

选择您的项目并移至包依赖项选项卡,然后选择并删除

请按照图像操作

enter image description here


你会觉得在“软件包依赖”下面应该有一个简单的“左键单击->删除”的选项,哈哈。 - undefined
@PaulCarlton兄弟,你真是太聪明了。但是你知道一切都是从零开始的吗?我想没有人来这里是为了学习捷径对吧。我只是提供了一个简单的解决方案。请不要打击任何人的积极性。对打断你表示抱歉。 - undefined

15

即使删除并重新安装pod,依赖关系仍然会不断出现。

在此输入图片描述


10
请按照以下步骤顺利从Xcode项目中删除特定软件包:

enter image description here


1
这是最终对我有效的解决方案。 - Maruta
解释得很清楚。 - Bilal Khan

2
除了Pierre的回答之外,这个问题让我疯狂,我有一个子项目正在编辑,我忘记了它(它在一个子文件夹中)。即使我在“Swift Packages”窗格中删除了它,它仍然会出现。删除该子文件夹引用可以确保PM依赖项消失。最初的回答。

2
我移除了 Swift 包,但是它的依赖仍然显示在项目中。我看到 Swift 包仍在左侧窗格底部的 Frameworks 文件夹中, enter image description here 我从那里将它移除后,依赖关系就消失了。

1

首先,我从Package.swift的依赖项和目标中将其移除,然后使用swift package generate-xcodeproj重新生成了我的项目文件。


1

嵌套的Swift包依赖

背景

正如其他答案所提到的,我们可以通过文件 -> Swift Packages -> 添加包依赖工作流轻松地将Swift包导入项目中,这适用于大多数应用程序。我添加了这个答案,以进一步优化具有嵌套依赖项的包。

Swift包不仅通过Git源代码检出导入,而且还通过一个或多个包产品导入。在我的情况下,我想保留包,因为我在一个目标中使用它,但在另一个目标中不使用它。有时,包含多个我们不需要的依赖项,这是修剪未使用的依赖项的绝佳机会。

未使用的导入

我最近犯了一个错误,自动导入了Swift包依赖项引用的所有模块,即使我不需要它们。这很常见,因为包可以有多个产品,每个产品为不同的应用程序公开不同的API。

如果您不确定是否需要导入,请检查并删除它。例如,包可能包括一个Objective-C模块,该模块添加了一个额外的不必要导入。

image of build phases

在我的情况下,我导入了一个通过多个嵌套库导出的Swift包:OHHTTPStubsOHHTTPStubsSwift就像上面的例子一样。

总体思路

我们可以通过Build Phases或Target General设置选项卡删除嵌套的Swift包依赖项,而不必删除包本身。删除不必要的依赖项是一种良好的实践,可以节省应用程序的内存占用,并简化构建时间。

用于单元/界面测试的嵌套依赖项

每个目标应仅导入其使用的库。

规则:

  1. 在导入整个项目时,仅导入您实际需要的Swift Package Manager产品。如果只使用包装器子规格,则只需导入该子规格。
  2. 主机应用程序目标不需要导入UI测试库。我们可以从Frameworks、Libraries、and Embedded Content选项卡中安全地删除这些库。这将自动取消链接此目标的Build Phases选项卡中的产品。
  3. 我们的UI测试目标可以通过Build Phases -> Link Binary with Libraries导入所需的Package产品。如果一个依赖项仅在UI测试中使用,请从主机应用程序目标Frameworks、Libraries、and Embedded Content中删除它。
  4. 单元测试目标无法链接到未嵌入主机应用程序的库。因此,我们需要将在单元测试中使用的产品添加到主机应用程序目标的常规设置选项卡中的Frameworks、Libraries、and Embedded Content中。我们不需要向单元测试目标的Link Binary with Libraries中添加任何产品。

来自我的经验的例子

OHHTTPStubsSwift是一个Swift CocoaPods subspec,它提供了一个更好的API包装器来覆盖ObjC API,但已经导入了ObjC API (OHHTTPStubs)。

我从Host Target中删除了Package Products,因为我只在UI测试中使用它。然后我只通过Build Phases导入了OHHTTPStubsSwift


1
这对我来说比使用“Swift Package”菜单更好,因为我已经安装了FirebaseKit,但需要添加Database模块。使用“Swift Package”菜单,我只需删除所有内容,然后再次安装,在此步骤中选择Database选项即可。这不完全是上面的问题,但您的方法可以同时完成两个任务。 - tontonCD

0

我找到的没有答案。如果git链接已经失效,*.xcodeproj/project.pbxproj必须更改为正确的链接。Xcode会捕捉到修改并自动更新。


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