这个问题是关于如何在开发过程中获取CocoaPods管理的依赖项的最新代码,即没有完成整个"推送新的podspec"舞。
假设我们有三个项目A
,B
和C
。依赖关系是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
检索更改。这不会发生。
每当我们(知道)想要重新提取依赖关系时,请执行:
A$ pod update
这绝对是最新的代码。然而,在A$ rm -rf Pods/ Podfile.lock
A$ pod cache clean --all
A$ pod install
每次拉入后,它都不是方便也不高效,推入A
或B
,或在C
之间切换{1}}。
为了贴近设置,我们必须在主分支上的每个(有意义的)提交集合之后创建一组全新的podspecs和Podfiles(即功能的合并所有新版本A
(1.x-y
内部版本号或其他内容);推动podspecs;并在y
和pod update
中运行A
。
虽然这在CI设置中可能是可行的(我们遗憾的是还没有),但是手动执行它是一项令人望而却步的工作。 Git钩子可能是一种解决方法。
在非版本分支上,执行
B
即绕过podspec回购。不幸的是,这不会在这里工作因为# A/Podfile
...
pod 'A', :git => "...", :branch => "master"
会检查pod
并找到它的依赖B.podspec
,我们无法以类似的方式指定它。此外,C
总是会重新安装,无论是否有新的提交。
使用CocoaPods跟踪分支是否有良好(低维护)方式?如果没有,有什么替代方案?
答案 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>