嵌套的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。