Cocopods 和 GitHub 的叉子

这是我第一次开发 GitHub 项目,而且我对 CocoPods 也不太在行,所以请耐心等待。

Basically, I forked a project on GitHub using the following in my Podfile:

pod 'REActivityViewController', '~> 1.6.7', :git => 'https://github.com/<username>/REActivityViewController.git'

I then made some changes to the fork, and of course when I did a pod install to install another pod it reinstalled the original REActivityViewController and erased my changes.

我意识到我需要在另一个 pod install之前将更改推到我的 fork 上,但是考虑到这是由 CocoaPods 安装的回购,我如何知道正在安装的是 fork 呢?我查看了安装在 Pods文件夹下的 REActivityViewController文件夹,没有任何 git 文件。

我是否需要在项目之外的分支上工作,然后使用 CocoPods 来安装更改?这工作流程太繁琐了。

或者我需要对子模块做些什么吗?

22371 次浏览

I will answer this question using an example. I have a fork of TTTAttributedLabel with some extra functionality I added here:

Https://github.com/getaaron/tttattributedlabel

为了在 Cocoapods 项目中使用它,我:

  1. Push my changes to my fork
  2. 配置我的 Podfile 以获得更改和更新

一旦您将更改推送到分支,就可以获得最后一次提交的 SHA。你可以使用 git rev-parse origin/master | pbcopy或者在 GitHub 提交页面上为你的项目做到这一点: Screenshot of copying a commit's SHA on GitHub

然后,您可以像下面这样在您的 Podfile 中指定特定的 fork 提交:

pod 'TTTAttributedLabel', :git => 'https://github.com/getaaron/TTTAttributedLabel.git', :commit => 'd358791c7f593d6ea7d6f8c2cac2cf8fae582bc1'

之后,pod update将从分支更新这个特定的提交。如果您愿意,您也可以为分支创建一个 podspec,但是我发现这种方法更简单,而且我不会频繁地进行更改以证明新工作流的合理性。

我是否需要在项目之外的分支上工作,然后使用 Cocoapods 来安装更改?这样的工作流程太麻烦了。

你可以这样做,但我通常:

  1. 编辑项目中的代码并确保它能正常工作
  2. 将更改复制到我的分叉
    • 出口补丁,或
    • 复制整个源代码文件
  3. 提交并推送到 GitHub
  4. 向 Podfile 通报新的民政事务局局长
  5. 运行 pod update

Or do I need to do something with submodules?

不,你不需要。

另一种选择是让您的项目直接引用 pod,而不是通过 github。这样,您就不必为了测试更改而不断提交 fork 或复制/粘贴代码。您可以同时使用两个不同的 Xcode 项目,并分别提交到它们各自的项目中。

pod 'AFNetworking', :path => '~/Documents/AFNetworking'

CocoaPods Documentation: Http://guides.cocoapods.org/using/the-podfile.html#using-the-files-from-a-folder-local-to-the-machine

enter image description here

CocoaPods 和 GitHub fork

使用 fork 有两种变体

  1. [ Podfile 特定分支]
  2. [ Podspec 特定分支]

The difference is in the first variant you must push changes into remote/origin branch, while the second variant allows you just commit changes in a local branch