Bundler是iOS开发人员的好朋友
这是“ 一切都与工具有关 ”周期 的第2条 。 所以,
抽象
Bundler是一个简单而强大的Ruby gem依赖管理器。 等等,为什么标题为“ iOS developer”的Ruby? 答案很简单-两种最流行的iOS开发工具(cocoapods和fastlane)几乎完全用红宝石编写,并以Ruby gem的形式分发。 尽管您可能尚未使用fastlane,但您肯定已经听说过cocoapods,并且我99.99%的人肯定在开发过程中使用了cocoapods(或使用了它,但停止使用Carthage)。
所以,让我告诉您一些有关上述宝石的故事…
故事1
最近,我意识到我的机器上确实堆满了XCode游乐场:
其中一些是Swift独立的,另外一些则必须嵌入XCode项目中,因为它们应该与Alamofire,ReactiveSwift等3d方库一起使用。 我决定为此目的创建一个XCode项目“ PlaygroundsHost”,用我正在使用的最广泛使用的Pod填充它,然后将所有Playground缓慢移入该项目以将它们保持在单个位置。 将3d-party库集成到游乐场的流程很简单:
- 创建一个新项目。 关闭它。
- 在根文件夹中创建一个Podfile。 装上必要的豆荚(例如Alamofire)
- 运行
pod install
- 运行
open *.xcworkspace
打开新创建的工作区 - 创建一个新的Playground,将其放置在项目文件夹中的某个位置(在我的情况下为
$PROJECT_DIR/Playgrounds/MyPlayground.playground
) - 将创建的Playground拖到XCode中。您将看到类似以下内容:
- Cmd + B构建所有Pod和项目
- 完成后,您现在可以在操场上使用
import Alamofire
了。
您的XCode Project Navigator选项卡如下所示:
好吧,我做到了……
错误:无法查找符号:
__T09Alamofire7requestAA11DataRequestCAA14URLConvertible_p_AA10HTTPMethodO6methods10DictionaryVySSypGSg10parametersAA17ParameterEncoding_p8encodingAJyS2SGSg7headerstFfA3_
我很困惑,尝试使用Google问题,结果发现可可足类1.4.0和1.5.0之间的游乐场集成出现了问题。 我的本地版本是1.5.2。 一个人可以将可可豆的版本降级到某个版本吗? 绝对可以。 在项目之间进行切换时,是否值得一直上下使用版本? 绝对不…
故事2
我的开发人员几天前曾问我,我是否现在正面临一个奇怪的问题,即他正在CI配置上,而在导出存档时却遇到了“ Lottie.framework不支持配置文件”的构建失败。
我们聊了一会儿,猜测该问题可能与cocoapods更新及其Copy Frameworks
构建阶段有关。
OTOH他使所有在本地计算机上运行的cocoapods 1.5.3都能顺利运行。 但是,他无法存档,因为代码签名身份位于远程CI机器上。 同样,他也没有远程访问权限来更改可可足类的远程版本,就像我在故事1中一样。
到了晚上,已经太晚了,无法联系对ssh
工人计算机使用ssh
的维护工程师。
故事3
大约一年前,我还遇到了CI存档构建的问题。 我们在一个只有几个工作人员的大型TeamCity集群上运行,我突然意识到,所有时间的构建都是在一个稍有不同的环境(cocoapods版本,fastlane版本)中的给定池中的随机工作者计算机上运行的,这很好,直到出现一些运输商问题向ITunesConnect提交构建时出现。
我也没有本地证书和规定,所以我最好的尝试是google,我发现几天前我的问题已在最新的fastlane中修复。 如何在没有ssh / vnc的情况下更新远程上的fastlane? 好…
打包机来了
将捆绑程序集成到您的开发/部署工作流程中非常简单,如ABC:
Gemfile
在项目的根文件夹中创建一个Gemfile
。 用以下内容填充它:
#Frozen_string_literal:是
来源“ https://rubygems.org”
宝石“ cocoapods”,“ 1.4.0”
B.保存并运行bundle install
。 Bundler将生成Gemfile.lock
,其目的与cocoapods宇宙中的Podfile.lock
相似。 实际上,Podfile / Podfile.lock和整个cocoapods概念都受到捆绑器和红宝石的强烈启发,因此从历史上讲,它们甚至更早就已经存在
C.从现在开始,使用命令bundle exec pod install
,而不仅仅是pod install
在根文件夹中另外两个文件和命令行中另外两个单词的交换中,您得到了什么?
- 跨所有环境(开发,登台,生产,无论您拥有什么)的一致性。 Bundler向您保证,在您的环境中运行的软件将在共享相同
Gemfile
和Gemfile.lock
远程环境中Gemfile.lock
(因此,如果还不太明显,请将它们提交到您的版本控制中 ) - 简单的版本更改。 操场上不能使用可可足1.5.2吗?
gem "cocoapods", "1.4.0", bundle install, bundle exec pod install, Cmd+B
想检查项目是否对cocoapods-prerelease有效吗?gem "cocoapods", "1.5.0.beta.1"
。 最新的通道出现问题了吗?gem "fastlane", "2.94.0"
- 在进入p.1之前,您和您的项目伙伴不再需要使用来自不同cocoapods版本的pod安装差异,这仅仅是因为您共享
Gemfile / Gemfile.lock
并具有相同的开发环境。
使用简单的可配置和易于使用的工具,您现在可以控制版本,而不是它们来控制您。
使用显式版本控制还有其他好处,例如
- 整个团队中版本更改的可见性。 无论谁进行更新,都会有明确的理由这样做,而其他人会检查更改
- 合理的版本更改→更好地控制3d-party代码库,因为开发人员需要在更新之前研究变更日志/发行说明
总结思想和深入阅读
在软件开发中,版本控制是最重要的概念之一,即使具有较高资历的工程师也经常忽略版本控制。 如果您想要更安全并生产更可靠和稳定的软件,请更加注意依赖项和版本。
本文涵盖的主题不是任何新知识,它已通过https://guides.cocoapods.org/using/a-gemfile.html、https://docs.fastlane.tools/getting-started/ios/进行了讨论设置/#use-a-gem文件。 另外,Felix Krause也尝试创建Wiki项目,涵盖iOS应用程序的版本控制,网址为:https://ios-factor.com/dependencies-绝对值得一看。
我现在完成了,谢谢您的阅读。 希望您能通过捆绑器享受自己的开发生活!
附注:我提到的所有三个故事都在捆扎机的帮助下迅速解决。