我已经做了几个月的iOS开发了,刚刚了解到有前途的用于依赖管理的CocoaPods库。
我在一个个人项目中尝试过:在我的Podfile中添加了对Kiwi的依赖,运行pod install CocoaPodsTest。Xcodeproj,瞧,它工作得很好。
我唯一想知道的是:我要签入什么,为了版本控制我要忽略什么?似乎很明显,我想签入Podfile本身,也可能是.xcworkspace文件;但是我是否忽略了Pods/目录?是否还会生成其他文件(当我添加其他依赖项时),也应该添加到.gitignore中?
不签入pod /版本控制的优点(按重要性的主观顺序):
Much easier to merge commits, and review code diffs. Merging is a common source of issues in a code base, and this allows you to focus only on things that are pertinent.
It's impossible for some random contributor to edit the dependencies themselves and check the changes in, which they should never do (and again would be hard to identify if the diff is massive). Editing dependencies is very bad practice because a future pod install could occlude the changes.
Discrepancies between the Podfile and the Pods/ directory are found quicker among teammates. If you check in Pods/ and, for example, update a version in the Podfile, but forget to run pod install or check in the changes to Pods/, you will have a much harder time noticing the source of the discrepancy. If Pods/ isn't checked in, you always need to run pod install anyway.
Smaller repo size. Having a smaller byte-footprint is nice, but that doesn't matter much in the grand scheme. More importantly: having more things in the repo also increases your cognitive load. There is no reason to have things in the repo that you shouldn't be looking at. Refer to documentation (the abstraction) to know how something works, not at code (the implementation).
Easier to discern how much someone contributes (since their lines of code contributed won't include dependencies they didn't write)
JAR files, .venv/ (virtual environments), and node_modules/ are never included in version control. If we were completely agnostic about the question, not checking in Pods would be the default based on precedent.
不检查pod的缺点/
切换分支或还原提交时必须运行pod install。
您不能仅仅通过克隆存储库来运行项目。您必须安装pod工具,然后运行pod install。
你必须有互联网连接才能运行pod install,而且pod的源代码必须可用。
如果依赖的所有者删除了他们的包,你就不能使用它(尽管你一开始就不应该使用已弃用的依赖——这只会迫使你更早地进行依赖卫生)。
总之,不包含Pods目录是防止更多不良做法的屏障。包含Pods目录可以使项目更容易运行。比起后者,我更喜欢前者。如果一开始就不存在犯某些错误的可能性,那么你就不需要向项目中的每个新人汇报“什么不能做”。我也喜欢有一个单独的版本控制Pods的想法,这减轻了缺点。
检查舱。
我认为这应该成为软件开发的一个原则
所有构建都必须是可复制的
确保构建的唯一方法是
可复制性是指控制所有依赖关系;全部签到
因此,依赖性是必须的。
一个从头开始的新开发人员应该能够检查您的项目并开始工作。
Why?
CocoaPods或任何其他外部库可能会改变,这可能会破坏事情。或者它们可能会移动,或者被重新命名,或者完全被移除。你不能依赖互联网为你储存东西。你的笔记本电脑可能死机了,生产中有一个严重的bug需要修复。主要开发人员可能会被公共汽车撞到,而他的替代者不得不匆忙启动。我希望最后一个例子只是理论上的但它确实发生在我工作的一家初创公司。撕裂的声音。
现在,实际上,您不能真正检入所有依赖项。您不能检入用于创建构建的机器的映像;你不能检入编译器的确切版本。等等。有现实的限制。但是你要尽可能地检查——不这样做只会让你的生活更加艰难。我们不希望这样。
最后一句话:pod不是构建工件。构建构件是从构建中生成的。您的构建使用Pods,而不是生成它们。我都不知道为什么要讨论这个问题。
最后取决于你采取的方法。
Cocoapods团队是这么想的:
是否检查您的Pods文件夹取决于您,因为
工作流程因项目而异。我们建议您保留
pod目录下的源代码控制,不要将它添加到您的
.gitignore。但最终这个决定取决于你。
就我个人而言,我想把Pods排除在外,如果我使用Node,就像node_modules,如果我使用Bower,就像bower_components。这适用于几乎所有的依赖管理器,也是git子模块背后的理念。
然而,有时你可能想要真正确定某个依赖项的最新状态,这样你才能在项目中拥有该依赖项。当然,如果您这样做,会有一些缺点,但这些问题不仅适用于Cocoapods,而且适用于任何依赖管理器。
下面是Cocoapods团队制作的利弊清单,以及之前提到的引文全文。
Cocoapods团队:我应该将Pods目录检入源代码控制吗?