获取指向分支的CocoaPods依赖项的最新代码

时间:2017-11-24 15:21:58

标签: git version-control module dependencies cocoapods

这个问题是关于如何在开发过程中获取CocoaPods管理的依赖项的最新代码,即没有完成整个"推送新的podspec"舞。

设置

假设我们有三个项目ABC。依赖关系是A取决于B,而B取决于C。每个项目都驻留在自己的Git存储库中。

我们认为我们使用虚拟次要版本来识别代码的当前状态。 podspecs位于我们自己的存储库中。

# A/Podfile
...
pod 'B', '1.dev'

# B/Podfile
...
pod 'C', '1.dev'

# B/B.podspec
Pod::Spec.new do |s|
    s.name = 'B'
    s.version = '1.dev'
    ...
    s.dependency = 'C', '1.dev'
end

# C/C.podspec
Pod::Spec.new do |s|
    s.name = 'C'
    s.version = '1.dev'
    ...
end

问题

我们将新提交推送到({1}}的主分支。我们期待

C

检索更改。这不会发生。

途径

  1. 每当我们(知道)想要重新提取依赖关系时,请执行:

    A$ pod update
    

    这绝对是最新的代码。然而,在A$ rm -rf Pods/ Podfile.lock A$ pod cache clean --all A$ pod install 每次拉入后,它都不是方便也不高效,推入AB,或在C之间切换{1}}。

  2. 为了贴近设置,我们必须在主分支上的每个(有意义的)提交集合之后创建一组全新的podspecs和Podfiles(即功能的合并所有新版本A1.x-y内部版本号或其他内容);推动podspecs;并在ypod update中运行A

    虽然这在CI设置中可能是可行的(我们遗憾的是还没有),但是手动执行它是一项令人望而却步的工作。 Git钩子可能是一种解决方法。

  3. 在非版本分支上,执行

    B

    即绕过podspec回购。不幸的是,这不会在这里工作因为# A/Podfile ... pod 'A', :git => "...", :branch => "master" 会检查pod并找到它的依赖B.podspec,我们无法以类似的方式指定它。此外,C总是会重新安装,无论是否有新的提交。

  4. 问题

    使用CocoaPods跟踪分支是否有良好(低维护)方式?如果没有,有什么替代方案?

1 个答案:

答案 0 :(得分:1)

可能的解决方案是使用本地播客。

样本架构:

SomeWhere/BigFolder
          -- ProjectAWithItsPodSpecFiles
          -- ProjectBWithItsPodSpecFiles
          -- ProjectCWithItsPodSpecFiles

这样在您的PodFile A中,您可以:

pod 'MyCustomPodB', :path => '../FolderPodB'
pod 'MyCustomPodC', :path => '../FolderPodC'

这增加了修改你自己的pod类的可能性,而不需要pod update / git pull,也没有提示“MyFileInMyPod”被锁定进行编辑,你可能无法保存你的改变。你想每次从XCode解锁吗?

我们如何告诉每个人这样做,这意味着保留文件夹的架构?

使用Repo,Google提供的工具!

这几个方面的工具是什么:
它可以同时从各种git存储库中提取同步工作。
您有一个manifest.xml个文件,您可以在其中指定存储库,分支和本地路径(对于本地体系结构)。这是一个tutorial。 如果您使用的是私有存储库,我建议使用带有SSH密钥的HostAlias

我的同事继续使用 Repo ,我不是。我一直使用 SourceTree.app 逐一拉/推每一个,我只使用 Repo 作为“启动器”,这创造了我整个本地架构。 / p>

在我们自己的项目中:

Projects/MainApp
Projects/CoreClasses
Projects/Custo, Like Colors, etc.
Projects/OtherModule

我,大部分时间都在使用 MainApp ,并且需要修改 CoreClasses 而不会出现任何问题。

我们的Manifest.xml示例(在另一个几乎只有文件的私有存储库中):

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
    <remote name="remoteName" fetch="ssh://git@ourCommonAlias/RestOfTheGitPathExceptTheLastComponent"/>
    <default revision="masterBranchIsToSetByDefaultIfNeeded"
           remote="bitbucket"
           sync-j="4" />
    <project name="MainApp.git" remote="remoteName" path="BigFolder/MainApp"/> <!-- The name is the last component of the repository, the path the local path, the remote, the "start of the ssh give previously -->
    <project name="CoreClasses.git" remote="remoteName" path="BigFolder/CoreClasses"/>
    <project name="Custo.git" remote="remoteName" path="BigFolder/Custo" revision="someBranchIfNeededThere"/>
    <project name="OtherModule.git" remote="remoteName" path="BigFolder/OtherModule"/>

</manifest>