Tag: 特拉维斯·慈

缓存迦太基以加速iOS持续集成

几乎没有任何iOS项目没有任何依赖关系。 几乎每个项目都必须管理内部或第三方的某种依赖性。 每种主要的编程语言都有自己的依赖性管理系统。 Swift具有多种选项来管理依赖项。 苹果很久以来一直在开发自己的Swift Package Manager。 认真地讲,很久以来,iOS开发人员都渴望获得Apple支持的官方依赖项管理器,但事情似乎以乌龟的速度发展着。 Swift Package Manager仍然不支持iOS项目。 CocoaPods是iOS项目中最常用和最传统的依赖管理,因为开发人员没有其他选择。 CocoaPods是一种神奇的,不可思议的,超能力的魔咒,它使您的Xcode项目无法正常工作。 它建立依赖关系,创建工作区,执行一些脚本和其他东西。 CocoaPods运行良好,但是很少有开发人员了解运行pod install命令时发生的实际情况。 如果一切正常,每个人都会感到高兴,但是当pod安装失败时,每个人都会感到恐慌。 没有人知道如何解决该问题,需要花费数小时,数天或数周的时间才能解决由CocoaPods造成的混乱。 爱它还是恨它,无论哪种方式,您都必须使用它。 迦太基的诞生 Somone了解了iOS开发人员对CoacoPods的痛苦,并制作了一个名为Carthage的婴儿作为CocoaPods的替代品。 Carthage仅适用于动态框架,并且使开发人员能够完全控制他们对Xcode项目所做的工作。 它只是构建框架,开发人员必须手动将那些框架链接到目标的各个构建阶段。 迦太基运作良好,但缺点不多 迦太基仅适用于动态框架 迦太基的开发者社区很小,为该项目做出了贡献 使用迦太基时涉及的手动步骤很少 主要缺点是,它是如此缓慢,特别是在CI服务器上。 迦太基检出和构建每个构建的每个框架。 对于CI而言,这绝对不是一个很好的方法,因为构建速度将非常缓慢且冗长。 如果没有任何更改,则没有干净的解决方案来缓存Carthage /目录。 在这篇文章中,我们将看到如何在CI服务器上缓存Carthage目录并加快构建速度。 CI上的迦太基 迦太基最常见的用法是运行迦太基更新或脚本作为CI脚本的一部分,该脚本会修改所有依赖项以使用最新版本的Cartfile.lock文件更改,该更改不正确,并导致签出和构建所有依赖项。 这将使CI的构建速度非常慢。 因此在CI上使用迦太基的理想方法是 检查Cartfile.lock是否存在。 如果该文件不存在,那么我们必须使用Carthage bootstrap引导所有依赖项。 如果Cartfile.lock存在但未更改,则无需执行引导程序或更新操作,并且可以使用先前版本中Carthage目录中的内容。 如果存在Cartfile.lock并更改了某些依赖关系,则我们仅需引导那些过时的依赖关系,而不是全部。 现在,我们知道了如何使用Cartfile.lock状态执行引导或跳过引导的机制。 下一步将是编写一个脚本来做到这一点。 根据CI服务器提供的环境变量,我们可以通过多种方式实现这一目标。 Jenkins使用的脚本如下所示 [-f Cartfile.resolved]; 然后 CARTFILE_CHANGED =`git diff –stat $(GIT_PREVIOUS_SUCCESSFUL_COMMIT)$(GIT_COMMIT)| grep’\ […]