像CocoaPods、Carthage或SwiftPM这样的依赖管理器似乎很神奇。但他们似乎也有点尴尬和复杂。让我们把它们分解成各自的组成部分让人们更容易理解他们为什么以这种方式工作。
获取(匹配)代码
依赖项管理器必须做的第一件事是确保获得正确的版本应用程序当前版本的代码。最简单的方法是Git子模块:您定义依赖项代码的某个版本(在本例中,特定Git提交)并将其写入应用程序的当前版本。然后,当如果你签出你的应用程序,那么代码也会被签出。
这里最重要的部分是依赖项的代码最终位于固定目录路径,所以您的Makefile或Xcode项目文件或其他任何文件都可以可靠地引用它。
这两点都由您的.git模块
file:指定目录应该签出依赖项,以及表示代码的特定版本。每个依赖项管理器都有大致相同的东西,它叫什么名字购物车文件
,播客文件
,或包装.swift
.
合并重复依赖项
依赖项管理器需要做的第二件事是,如果存在多个依赖关系依赖于同一个子依赖关系,您只能得到一个子依赖。想象一下你的应用程序打电话我的音乐播放器.app
它由两个子组件组成,MP3回放库
和AAC回放库
。这两个依赖关系都依赖于元数据库
从属关系用于从文件中读取艺术家、歌曲标题、作曲家、专辑等。
你最初的直觉是添加元数据库
二者的子模块MP3回放库
和AAC回放库
。但你会收到编译器的投诉关于重复符号。
因此,大多数依赖关系管理器在这种情况下所做的是,它们强制执行相同的操作依赖项只下载一次,并由所有需要它的子模块共享通常情况下,它们不会将依赖项下载到与依赖于它的组件,但位于中心位置。就可可荚而言意味着所有依赖项都下载到豆荚
应用程序文件夹中的目录。迦太基有自己的迦太基
文件夹,SwiftPM将所有依赖项下载到其包装
目录。
这不仅使依赖关系管理器更容易检测重复的依赖关系,这也意味着依赖项知道它们的其他依赖项将紧邻它们在文件系统中。事实上,我从事的项目就是这样处理的依赖项:每个应用程序都有一个子模块
文件夹,我们将所有依赖关系。所有子模块(框架、库等)都已设置,因此预期他们的依赖性就在他们旁边,这是应用程序存储库的工作正确的版本,以便所有内容都能构建。
包管理器只是自动完成这项工作。
解决冲突
依赖项管理器必须做的另一件事是检测模块之间的冲突,如果可能的话,解决它们。他们如何做到这一点,是通过允许一系列版本,而不是只有一个固定版本。这样,如果您只是进行兼容更改,依赖项管理员可以自动将您升级到新版本,使其与其他版本相匹配组件的要求。
他们通常通过收集每个模块的所有需求,然后匹配针对这些需求的可用版本,通常选择最新的匹配版本。通常这也意味着您不能像子模块那样只引用Git分支,而是需要实际标记发布并使用语义版本控制能够区分彼此兼容的版本和不兼容的版本。
这样做的优点是依赖关系管理器可以查看子组件是否具有依赖项的版本要求冲突。比如,如果MP3回放库
习惯于元数据库
1.0.0
但是AAC回放库
欲望元数据库
2.0.0
,其中增加第一个数字根据语义版本控制表示API已以不兼容的方式更改,没有任何版本与中指定的版本范围播客文件
/购物车文件
/包装.swift
,因为范围是1.x.x
对于MP3回放库
但是AAC回放库
的范围是2.x.x版
,什么都不能二者都1.x个
和2.x个
.
已解析的依赖项列表文件
大多数依赖项管理器都有列出依赖项的文件的第二个版本。CocoaPods有播客文件.lock
,迦太基Cartfile.已解决
SwiftPM有已解决的包
.这些是干什么用的?
普通依赖项列表文件(播客文件
,购物车文件
,包装.swift
)包含一个范围版本号的。但你不能建立“一系列版本”。你必须选择一个。自我们希望能够返回到应用程序的特定版本并重新构建它(例如。要修复错误),我们需要能够记住(在Git或任何版本控制中using)当时我们的依赖范围被解析为什么版本。
这就是解析的依赖项列表文件的目的。它包含具体版本的依赖项,并且您可以将其签入到您的版本中控件。
将依赖项集成到构建中
虽然严格来说不是依赖管理的一部分(例如,迦太基没有这样做),许多依赖项管理器也与应用程序集成,以避免您必须引用他们在应用程序中检出的依赖项。
虽然苹果刚刚将SwiftPM支持添加到Xcode中,但依赖项管理器没有由第一方维护的必须在这里做自己的工作。就可可荚而言,这个一开始有点困惑,但实际上并没有那么复杂。
CocoaPods所做的是,它基本上编辑您的项目文件并添加依赖项假设它们都是框架和库。然而,自从CocoaPods和开发人员编辑项目文件都有点风险,他们实际上创建了一个围绕项目工作。工作区是围绕几个项目的保护伞让它们相互看到,并允许您手动或通过覆盖其中的设置xcconfig文本文件。
因此,CocoaPods所做的是,它围绕您的项目创建一个工作区。唯一一个编辑工作区是CocoaPods。您可以自由编辑项目文件,无需任何碰撞。从那以后,你只需要记住双击“工作区”不是您的项目来构建您的应用程序(否则您将无法获得依赖项和应用程序无法构建)。
就这样?
对。您知道,依赖项管理器的一般功能由几个简单的部分。当然,创建自己的并使其可靠地工作更难,而且可能需要的大量边缘案例和附加功能。但它的核心是什么?只是对于一个人们已经用手解决了很久的问题,一个相当直接的解决方案一会儿。
你知道这是怎么回事:不要花时间解决你没有的问题,但一旦你有一个问题,有一个自动化的解决方案意味着你可以避免偶然的错误用手表演。
]]>