我在Xcode 11中有一个项目,我添加了Swift包管理器依赖项。我现在意识到,我不再需要以前添加到项目中的一个包依赖项。

如下所示,在文件> Swift Packages下没有选项用于从该项目的Swift Package Manager中删除一个打包器。

我已经尝试从project.xcworkspace/xcshareddata/swiftpm/ package的数组中删除包。解决文件。但它仍然没有从Xcode中删除它,下次我更新到最新的包版本时,它会读取包的条目。解决文件。

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


当前回答

嵌套的Swift包依赖关系

背景

正如其他答案所提到的,我们可以很容易地通过File -> Swift Packages -> Add Package Dependency工作流将Swift Packages导入到项目中,这适用于大多数应用程序。我添加了这个答案,作为对具有嵌套依赖关系的包的进一步优化。

Swift包不仅可以通过Git源代码签出导入,还可以通过一个或多个包产品导入。在我的例子中,我想要保留Package,因为我在一个目标中使用了它,而不是在另一个目标中。有时一个包包含多个我们不需要的依赖项,这是一个删除未使用的依赖项的好机会。

未使用的导入

我最近犯了一个错误,我自动导入了Swift包依赖引用的所有模块,甚至那些我不需要的模块。这很常见,因为包可以有多个product,每个product为不同的应用程序公开不同的api。

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

在我的例子中,我导入了一个Swift包,它通过多个嵌套库导出:上面例子中的ohhttpstubbs和OHHTTPStubsSwift。

一般的想法

我们可以通过构建阶段或目标通用设置选项卡删除嵌套的Swift包依赖项,而不删除包本身。删除不必要的依赖是一种很好的做法,可以节省应用程序的内存占用,并简化构建时间。

单元/UI测试的嵌套依赖项

每个目标应该只导入它使用的库。

规则:

Import only the Swift Package Manager Products you actually need when importing for the whole project. Import only the wrapper subspec if that is all you use. The Host Application Target doesn't need to import UI testing libraries. We can safely delete these libraries from the Target General tab in Frameworks, Libraries, and Embedded Content. This will automatically unlink the Product from the Build Phases tab for this Target. Our UI Testing Target can import the Package Products it needs via Build Phases -> Link Binary with Libraries. If a dependency is only used in UI Tests, delete it from the Host Application Target Frameworks, Libraries, and Embedded Content. The Unit Testing Target can't link to libraries that are not embedded in the Host Application. Thus, we need to add products used in Unit Tests to the Host Application Target in the General settings tab for Frameworks, Libraries, and Embedded Content. We DON'T need to add any Products to Link Binary with Libraries for the Unit Tests Target.

以我的经验为例

OHHTTPStubsSwift是等效的Swift CocoaPods子规范,它在ObjC API上添加了一个更好的API包装器,但已经导入了ObjC API (ohhttpstub)。

我从主机目标中删除了“包产品”,因为我只在UI测试中使用它。然后我只通过构建阶段导入了OHHTTPStubsSwift。

其他回答

我的发现没有答案。如果git链接已断开,则*.xcodeproj/project。Pbxproj必须更改为适当的链接。Xcode会自动捕获修改并更新。

我删除了swift包,但它的依赖关系仍然显示在项目中。 我看到swift包仍然在左侧窗格底部的Frameworks文件夹中,

我把它从那里移走了,依赖性消失了。

请按照以下步骤顺利地从Xcode项目中移除特定的包。

依赖保持弹出后,甚至删除pod和重新安装pod。

嵌套的Swift包依赖关系

背景

正如其他答案所提到的,我们可以很容易地通过File -> Swift Packages -> Add Package Dependency工作流将Swift Packages导入到项目中,这适用于大多数应用程序。我添加了这个答案,作为对具有嵌套依赖关系的包的进一步优化。

Swift包不仅可以通过Git源代码签出导入,还可以通过一个或多个包产品导入。在我的例子中,我想要保留Package,因为我在一个目标中使用了它,而不是在另一个目标中。有时一个包包含多个我们不需要的依赖项,这是一个删除未使用的依赖项的好机会。

未使用的导入

我最近犯了一个错误,我自动导入了Swift包依赖引用的所有模块,甚至那些我不需要的模块。这很常见,因为包可以有多个product,每个product为不同的应用程序公开不同的api。

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

在我的例子中,我导入了一个Swift包,它通过多个嵌套库导出:上面例子中的ohhttpstubbs和OHHTTPStubsSwift。

一般的想法

我们可以通过构建阶段或目标通用设置选项卡删除嵌套的Swift包依赖项,而不删除包本身。删除不必要的依赖是一种很好的做法,可以节省应用程序的内存占用,并简化构建时间。

单元/UI测试的嵌套依赖项

每个目标应该只导入它使用的库。

规则:

Import only the Swift Package Manager Products you actually need when importing for the whole project. Import only the wrapper subspec if that is all you use. The Host Application Target doesn't need to import UI testing libraries. We can safely delete these libraries from the Target General tab in Frameworks, Libraries, and Embedded Content. This will automatically unlink the Product from the Build Phases tab for this Target. Our UI Testing Target can import the Package Products it needs via Build Phases -> Link Binary with Libraries. If a dependency is only used in UI Tests, delete it from the Host Application Target Frameworks, Libraries, and Embedded Content. The Unit Testing Target can't link to libraries that are not embedded in the Host Application. Thus, we need to add products used in Unit Tests to the Host Application Target in the General settings tab for Frameworks, Libraries, and Embedded Content. We DON'T need to add any Products to Link Binary with Libraries for the Unit Tests Target.

以我的经验为例

OHHTTPStubsSwift是等效的Swift CocoaPods子规范,它在ObjC API上添加了一个更好的API包装器,但已经导入了ObjC API (ohhttpstub)。

我从主机目标中删除了“包产品”,因为我只在UI测试中使用它。然后我只通过构建阶段导入了OHHTTPStubsSwift。