我从事 iOS 开发已经几个月了,刚刚了解到有前途的 可可豆荚 用于依赖管理的库。

我在个人项目中尝试过:添加了依赖项 猕猴桃 到我的 Podfile,运行 pod install CocoaPodsTest.xcodeproj, , 和 , ,效果很好。

我唯一想知道的是:对于版本控制,我应该签入什么,以及我应该忽略什么?显然我想签入 Podfile 本身,也可能签入 .xcworkspace 文件;但我会忽略 Pods/ 目录吗?是否还有其他文件(当我添加其他依赖项时)会生成,我也应该添加到我的 .gitignore 中?

有帮助吗?

解决方案

就个人而言,我不会检查PODS目录和内容。我不能说我考虑到了很长时间考虑到含义,但我的推理是如此:

podfile是指每个依赖性的特定标签或或提交,所以可以从podfile生成豆荚,它们更像中间构建产品而不是源,因此,不需要版本控制我的项目。

其他提示

我提交了我的pods目录。我不同意PODS目录是一个建立人工制品。事实上,我绝对会这样做。它是您的应用程序资源的一部分:它不会在没有它的情况下建立!

更容易将Cocoapod作为开发人员工具而不是构建工具。它不会构建您的项目,它只是克隆并为您安装依赖项。不需要安装CocoApods以便能够简单地构建您的项目。

通过将CocoApods成为您的构建依赖性,您现在需要确保它在您可能需要构建项目的任何地方都可以使用......团队管理员需要它,您的CI服务器需要它。通常应该是一项规则,始终能够克隆您的源存储库并在没有进一步努力的情况下构建。

未告知您的PODS目录,如果您经常交换分支,也会创建大规模的头痛。现在,每次切换分支时都需要运行POD安装,以确保依赖项是正确的。这可能会减少麻烦,因为您的依赖关系稳定但早期在一个项目中,这是一个大量的时间汇。

所以,我忽略了什么?没有。 podfile,锁定文件和pods目录都得到提交。相信我,它会拯救你很多麻烦。什么是缺点?一个略大的回购?不是世界末日。

我建议使用 GitHub 的 Objective-C gitignore。具体来说,最佳实践是:

  • Podfile 必须 始终处于源代码控制之下。
  • Podfile.lock 必须 始终处于源代码控制之下。
  • CocoaPods 生成的工作区 应该 保持在源代码控制之下。
  • 引用的任何 Pod :path 选项 应该 保持在源代码控制之下。
  • ./Pods 文件夹 保持在源代码控制之下。

欲了解更多信息,您可以参考 官方指南.

来源:我是 CocoaPods 核心团队的成员,就像 @alloy


尽管 Pods 文件夹是一个构建工件,但您在决定是否将其置于源代码控制之下时可能会考虑以下原因:

  • CocoaPods 不是包管理器,因此作者将来可能会删除该库的原始源。
  • 如果 Pods 文件夹包含在源代码管理中,则无需安装 CocoaPods 来运行项目,因为签出就足够了。
  • CocoaPods 仍在开发中,有些选项并不总是会产生相同的结果(例如 :head:git 选项当前未使用存储在 Podfile.lock).
  • 如果您可以在中/长时间后恢复项目工作,那么故障点就会减少。

.gitignore 文件

没有答案 实际上 提供 .gitignore, ,所以这里有两种口味。


检查 Pods 目录 (好处)

Xcode/iOS 友好的 git 忽略,跳过 Mac OS 系统文件、Xcode、构建、其他存储库和备份。

.gitignore:

# Mac OS X Finder
.DS_Store

# Private Keys
*.pem

# Xcode legacy
*.mode1
*.mode1v3
*.mode2v3
*.perspective
*.perspectivev3
*.pbxuser

# Xcode
xcuserdata/
project.xcworkspace/
DerivedData/

# build products
build/
*.[oa]

# repositories
.hg
.svn
CVS

# automatic backup files
*~.nib
*.swp
*~
*(Autosaved).rtfd/
Backup[ ]of[ ]*.pages/
Backup[ ]of[ ]*.key/
Backup[ ]of[ ]*.numbers/

忽略 Pods 目录 (好处)

.gitignore: (附加到之前的列表)

# Cocoapods
Pods/

无论您是否签入 Pods 目录,Podfile 和 Podfile.lock 都应始终处于版本控制之下。

如果 Pods 尚未办理登机手续,您的 Podfile 也许应该为每个 Cocoapod 请求明确的版本号。Cocoapods.org 讨论 这里.

我通常在客户的应用程序上工作。在这种情况下,我也将Pods目录添加到回购,以确保在任何给定时间任何开发人员都可以进行结帐并构建和运行。

如果它是我们自己的应用程序,我可能会排除PODS目录,直到我不会持续一段时间。 实际上,我必须得出结论我可能不是最好的回答你的问题的人,与纯粹的用户的观点:)我将从 https://twitter.com/cocoapodsorg

此答案直接在CocoApod文档中给出。您可以查看“ http://guides.cocoapods.org/using/using-cocoapods.html#shourcout-i-ignore-the-pods-directory-in-source-control

您是否检查您的PODS文件夹取决于您,如 工作流程因项目而异。我们建议您保留 源控制下的PODS目录,并不将其添加到您的 .gitignore。但最终这一决定取决于您:

检查Pods目录 的好处

  • 在克隆回购后,该项目可以立即构建和运行,即使在机器上安装了Cocoapods。没有 需要运行pod安装,并且不需要互联网连接。
  • Pod工件(代码/库)始终可用,即使窗口的源(例如github)要下降。
  • 在克隆回购后,保证了Pod工件与原始安装中的植物。

    忽略pods目录 的好处

    • 源控制回购将较小,占用更少的空间。

    • 只要所有豆荚的源(例如github)可用,Cocoapod通常能够重新创建相同的安装。 (从技术上讲,无法保证运行POD安装将获取 在不使用提交的沙子时重新创建相同的伪影 podfile。在Podfile中使用zip文件时,尤其如此。)

    • 在执行源控制操作时不会有任何冲突,例如用不同的POD合并分支 版本。

      您是否检查PODS目录,Podfile和 podfile.lock应始终保留在版本控制下。

我检查一切。(Pods/Podfile.lock。)

我希望能够克隆存储库,并知道一切都会像上次使用该应用程序一样工作。

我宁愿供应商的东西,而不是有不同结果的风险,这些结果可能是由不同版本的宝石造成的,或者在Pod的存储库等人中重写历史。

我在没有办理图书馆的开发人员的阵营中,假设我们在另一个位置有很好的副本。所以,在我的.gitignore我包括特定于Cocoapods的以下行:

Pods/
#Podfile.lock  # changed my mind on Podfile.lock
.

然后我确保我们在安全位置中有一个库的副本。而不是(mis-)使用项目的代码存储库来存储依赖关系(编译或未编译)我认为最好的方法是归档构建。如果您对构建的CI服务器(例如Jenkins),您可以永久存档对您很重要的构建。如果您在本地Xcode中完成所有生产构建,请习惯于为您需要保留的任何构建进行档案。就像是: 1.产品 - >存档

  1. 分发...提交到iOS应用程序商店/保存以用于企业或ad-hoc部署/您

  2. 在finder 中显示您的项目文件夹

  3. 右键单击并压缩“WhereProject”

    这提供了整个项目的竣工图像,包括用于构建应用程序的完整项目和工作空间设置以及二进制分布(例如闪闪发光,专有的SDK等睾丸等)是否它们使用cocoapods。

    更新:我已经改变了我的思想,现在做了将Podfile.lock提交到源控制。但是,我仍然相信豆荚本身是构建文物,应该通过诸如上面描述的CI服务器或归档过程等另一种方法来管理。

我更喜欢承诺 Pods 目录以及 PodfilePodfile.lock 确保我团队中的任何人都可以随时查看源代码,并且他们不必担心任何事情或做额外的事情来使其工作。

如果您已修复其中一个 Pod 内的错误或根据您的需要修改了某些行为,但如果未提交,这些更改将无法在其他计算机上使用,这也有帮助。

并忽略不必要的目录:

xcuserdata/

我必须说,我是一个向存储库提交豆荚的粉丝。遵循已经提到的链接将为您提供一个好的.gitignore文件来提取iOS的Xcode项目以允许豆荚,但是如果您如此希望,请为您轻松排除它们: https://github.com/github/gitignore/blob/master/objective-c.gitignore

我的推理是向存储库添加豆荚的粉丝是为了一个根本原因,没有人似乎正在接受,如果我们的项目如此依赖的图书馆突然从网上删除了什么?

  • 可能主持人决定他们不再想要保持他们的github 帐户打开如果图书馆说几年来会发生什么 (例如超过5年)的风险很高 项目可能不再可在源中提供
  • 也是另一个点,如果url到存储库的URL会发生什么 变化?让我们说那个人从他们的github提供豆荚 帐户,决定在不同的句柄下代表自己 - 你的豆荚URL将休息。
  • 最后另一个点。说如果你是像我这样的开发人员,那就做了很多 在各国之间飞行时编码。我快速拉动 'Master'分支,在该分支上进行吊舱安装,同时坐着 在机场,并拥有我全部设定即将到来的8小时 飞行。我在我的航班中得到3个小时,并意识到我需要切换到 另一个分支......'Doh' - 缺少的POD信息,只能在“主”分支上。

    nb ...请注意,“Master”分支开发只是为了示例,显然是版本控制系统中的“Master”分支机构,应随时保持清洁和可部署/可携带

    我认为来自这些,代码存储库中的快照肯定比严格在存储库大小。如上所述,Podfile.lock文件 - 虽然版本控制将为您提供Pod版本的良好历史记录。

    在一天结束时,如果您有截止日期,预算紧张,时间就是本质 - 我们需要尽可能多地浪费时间,而不是严格的意识形态,而是利用一套工具共同努力 - 让我们的生活更加高效。

在最后取决于你采取的方法。

这就是Cocoapods团队对它的看法:

您是否检查您的PODS文件夹取决于您,如 工作流程因项目而异。我们建议您保留 源控制下的PODS目录,并不将其添加到您的 .gitignore。但最终这一决定取决于你。 我个人希望保持 pods ,如 Node_Modules 如果我使用节点 bower_components 如果我使用 Bower 。这适用于几乎任何依赖性经理,并且是 Git子模块的哲学 aswell。

然而,有时您可能希望真正确定有关某种依赖性的最先进的,即您在项目中携带依赖性的方式。当然,如果您这样做,则存在几个缺点,但顾虑不仅适用于CocoApods,那些适用于那里的任何依赖性管理器。 下面有一个很好的 pros / cons 名单由Cocoapods团队制作,以及之前提到的报价的全文。

cocoapods团队:我应该检查源目录是否进入源控制?

这取决于个人:

为什么 Pod 应该成为存储库的一部分(在源代码控制下)并且不应被忽略

  • 来源相同
  • 您可以立即构建它 (即使没有可可足类)
  • 即使 Pod 被删除,我们仍然拥有它的副本 (是的,这可能发生,而且确实发生了。在一个旧项目中,您只想要一个小的更改,您需要实现一个新的库才能构建)。
  • pods.xcodeproj 设置也是源代码管理的一部分。这意味着例如如果你有这个项目 swift 4, ,但有些 Pod 必须位于 swift 3.2 由于尚未更新,这些设置将被保存。否则克隆存储库的人最终会出错。
  • 您始终可以从项目中删除 pod 并运行 pod install, ,则不能做相反的事情。
  • 即便是 作者 Cocoapods 推荐它。

一些缺点:更大的存储库,令人困惑的差异(主要针对团队成员),潜在的更多冲突。

给我,最大的担忧是未来证明你的来源。如果您计划持续一段时间的项目,并且Cocoapods曾经离开或其中一个豆荚的来源下降,如果尝试从存档建立新鲜的话,你完全没有运气。

可以使用定期的全源归档来缓解。

检查豆荚。

我认为这应该是软件开发的宗旨

  • 所有构建必须是可重复的
  • 确保构建的唯一方法 可重复的是控制所有依赖项;检查一切 因此,依赖关系必须。
  • 从头开始启动的新开发人员将能够查看项目并开始工作。

    为什么?

    cocoapods或任何其他外部库可能会发生变化,这可能会破坏事物。或者它们可能会移动或重命名或完全删除。你不能依靠互联网来为你存储东西。您的笔记本电脑可能已经死亡,并且在需要修复的生产中存在一个关键的错误。主要开发人员可能会被公共汽车击中,他的更换必须匆忙启动。我希望最后一个是一个理论榜样,但它实际上发生在我和初创公司。 RIP。

    现在,现实上,你无法真正检查所有依赖关系。您无法检查您用于创建构建的机器的图像;您无法检查编译器的确切版本。等等。有现实的限制。但是要检查你所能 - 不是这样做只是让你的生活更加努力。我们不想要那个。

    最终单词:POD不构建工件。构建工件是从构建生成的内容。您的构建使用POD,而不是生成它们。我甚至不确定为什么这必须争论。

理论上,您应该检查PODS目录。在实践中,并不总是上班。许多豆荚超出了GitHub文件的大小限制,因此如果您使用GitHub,您将在Pods目录中进行问题。

优点 不是 登记入住 Pods/ 版本控制(按重要性的主观顺序):

  1. 很多 更容易合并提交并检查代码差异。合并是代码库中问题的常见来源,这使您可以只关注相关的事情。
  2. 对于某些随机贡献者来说,不可能自己编辑依赖项并检查更改,他们永远不应该这样做(并且再次很难识别差异是否很大)。编辑依赖项是非常糟糕的做法,因为未来 pod install 可能会阻碍变化。
  3. 之间的差异 PodfilePods/ 队友之间可以更快地找到目录。如果您办理登机手续 Pods/ 例如,更新以下版本 Podfile, ,但忘记运行 pod install 或签入更改 Pods/, ,您将更难注意到差异的根源。如果 Pods/ 没有签入,你总是需要运行 pod install 反正。
  4. 较小的回购规模。拥有较小的字节占用空间固然很好,但这在宏伟的计划中并不重要。更重要的是:存储库中包含更多内容也会增加您的认知负担。没有理由在存储库中包含您不应该查看的内容。请参阅文档(抽象)来了解某些内容是如何工作的,而不是代码(实现)。
  5. 更容易辨别某人贡献了多少(因为他们贡献的代码行不包括他们未编写的依赖项)
  6. JAR 文件, .venv/ (虚拟环境),以及 node_modules/ 从未包含在版本控制中。如果我们对这个问题完全不可知 不是 登记入住 Pods 将是基于先例的默认值。

缺点 不是 检查在 Pods/

  1. 你必须跑 pod install 当切换分支或恢复提交时。
  2. 您不能仅通过克隆存储库来运行项目。您必须安装 pod 工具,然后运行 pod install.
  3. 您必须有互联网连接才能运行 pod install, ,并且 pod 的来源必须可用。
  4. 如果依赖项的所有者删除了他们的包,那么您就有麻烦了。

总之, 不包括Pods 目录是防止更多不良做法的护栏。 包括Pods 目录使项目的运行更加容易。我更喜欢前者而不是后者。你不需要向项目中的每个新人汇报“什么” 不是 如果一开始就不可能犯某些错误,那么“去做”。我也喜欢为以下内容提供单独的版本控制的想法 Pods 这减轻了缺点。

似乎是一个很好的结构方法,真的是将“pods”目录作为git子模块/单独的项目,这就是为什么。

  • 在使用若干开发人员使用的项目中具有POD,可以在拉杆请求中引起非常大的差异,几乎无法看到人们更改的实际工作(思考数百到数千个文件更改对于库,并且在实际项目中只有一些更改)。

  • 我看到没有向git提交任何东西的问题,因为拥有图书馆的人可以随时把它拿下,而你基本上是溶胶,这也解决了这一点。

您是否检查您的PODS文件夹取决于您,因为工作流程因项目而异。我们建议您将Pods目录保留在源控制下,并不将其添加到您的.gitignore。但最终这一决定取决于您:

在Pods目录中检查的好处

  1. 在克隆回购后,该项目可以立即构建和运行,即使在机器上安装了Cocoapods。不需要运行Pod安装,并且不需要互联网连接。
  2. Pod工件(代码/库)始终可用,即使窗口的源(例如github)要下降。
  3. 在克隆回购后,保证了Pod工件与原始安装中的植物。

    忽略PODS目录的好处

    1. 源控制回购将较小,占用更少的空间。 只要所有豆荚的来源(例如github)都可获得,Cocoapods通常能够重新创建相同的安装。(从技术上讲,当不使用PodFile中的提交SHA时,运行POD安装将获取和重新创建相同的伪像。在Podfile中使用zip文件时,尤其如此。)
    2. 在执行源控制操作时不会有任何冲突,例如使用不同的POD版本合并分支。 无论您是否检查PODS目录,Podfile和Podfile.lock应始终保留在版本控制下。

TL博士:当你追踪 Pods/ 文件夹中,该项目是比较容易 拿起。当你不会跟踪它,它是更容易地提高在当 你在一个团队中工作。

虽然Cocoapods组织鼓励我们的跟踪 Pods/ 目录,他们说这是给开发者决定是否做到这一基于这些优点和缺点:http://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control

就个人而言,我通常跟踪 Pods/ 文件夹中只用于项目,我不会上工作了一段时间。这样,任何开发人员可以迅速拿起,并继续努力,使用适当的版本cocoapods.

另一方面,我认为犯下历史记录得到更清洁的和更易于合并代码和审查其他人的代码时你是不是跟踪的 Pods/ 文件夹。我通常设置cocoapod库的版本,当我安装,以确保任何人都可以安装项目采用相同的版本。

此外,当 Pods/ 目录正在跟踪所有开发人员必须使用相同的版本的Cocoapods,以防止它改变数十的文件,我们每次运行 pod install 添加或删除。

底线:当你追踪 Pods/ 文件夹中,该项目是容易的选择。当你不会跟踪它,它更容易提高。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top