作为开发者,我们每个人都知道在项目中搭建一个干净的架构多么重要。模块化是最常见的策略之一。本文将主要介绍 iOS 工程中和模块化相关的基本概念。
Bundle 文件,本质上是一个可以包含子目录的文件目录。它可以很方便地把一些相关联的文件打包分发,比如图片、nibs、编译后的代码等。系统会把它当作单个文件,从而你可以在不知道其内部结构的情况下访问其资源。
Library 文件,在计算机科学中,它通常指被编译到一个或多个架构下的资源和代码的集合。在 iOS 应用中,分静态库 (static library) 和动态库 (dynamic library) 两种。
静态库一般是 *.a 文件,是目标文件 (object file) 的集合。一般意义上讲,它就是用一种机器语言描述的声明和指令序列,所以就会有一定限制:
在 build 时要使用和目标相同的处理器架构 (processor architecture) ,比如 iOS 应用的库就需要分别创建真机和模拟器的。库里面不能包含资源文件,比如:图片、nibs、strings 文件等。
动态库一般是 *.dylib 文件,它不像静态库会被拷贝到可执行文件中去,它们是在运行时动态链接的。iOS 的系统库是动态库,目前 iOS 不支持没有被 framework 包装起来的用户自定义动态库。
Framework 文件,是一个封装成单个包的多层文件目录,包含了库文件、头文件和资源文件。包含静态库的 framework 就是 static framework,包含动态库的就是 dynamic framework,因为 iOS 不允许应用之间共享库文件,所以即使是动态库,也需要被打包到应用中去,所以也叫 embed framework 。一个 universal framework (fat framework) 是指它里面包含了多种目标架构的库,比如: x86_64, arm64, armv7 等,可以使用 lipo 这个工具来构建。
XCFrameworks 文件,是由 Xcode 创建的一个可分发的二进制包,它可以包含多个目标架构和平台,从 Xcode 11 时开始支持。
Swift Package 包含了源文件以及一个配置文件 (Package.swift) 。它被用于 Swift Package Manager (SwiftPM) 中,帮助开发者实现方便的源代码级别的分发。
参考文章: Libraries, frameworks, swift packages… What’s the difference?