如何在不触及其他依赖项的情况下更新单个 pod
Posted
技术标签:
【中文标题】如何在不触及其他依赖项的情况下更新单个 pod【英文标题】:How to update a single pod without touching other dependencies 【发布时间】:2014-12-08 16:09:06 【问题描述】:我了解以下命令将更新单个 pod:pod update <podname>
。但是,这也会更新您之前安装的其他 pod(更新命令中未包含的 pod)的依赖关系。有没有办法更新单个 pod 并保留所有其他依赖项?
【问题讨论】:
要了解区别,您必须首先了解podfile.lock
是什么。查看链接及其引用的视频。
【参考方案1】:
确保您安装了最新版本的 CocoaPods。
$ pod update PODNAME
是最近推出的。
见this issue thread for more information:
$ pod 更新
当您运行
pod update SomePodName
时,CocoaPods 将尝试查找 pod SomePodName 的更新版本,而不考虑Podfile.lock
中列出的版本。它会将 pod 更新到可能的最新版本(只要它符合您的 Podfile 中的版本限制)。如果您在没有任何 pod 名称的情况下运行 pod update,CocoaPods 会将您的 Podfile 中列出的每个 pod 更新为可能的最新版本。
【讨论】:
感谢@mattt 的回复,我有最新版本的 CocoaPods(0.34.2),我确实尝试了$ pod update SomePodName
。但是,在某些情况下 CocoaPods 也会尝试更新其他 pod 的依赖关系。长话短说,在某些情况下,SomePodName 并不是唯一会更新的 pod。
@mattt,你不知道如何在不更新已安装的 Pod 的情况下安装特定的 Pod?
当我自己修改一些依赖项并运行 pod install
时,它会恢复到其原始版本。但我不想丢失我的更改
@mattt,我指的依赖项不是正在更新的 pod 的依赖项。我认为我的问题结构不够好,但假设我们更新了 pod A,其他一些不是 pod A 依赖项的 pod 也会更新。顺便说一句,这是一个老问题,所以不确定从那以后是否已经解决了..
pod update
触及一切。它并没有按照锡上所说的那样做,这非常令人沮丧。从您没有告诉它触摸的其他 pod 中随机删除标题,等等。【参考方案2】:
只是一个小通知。
pod update POD_NAME
仅当此 pod 已安装时才有效。否则你将不得不用
更新它们pod update
命令
【讨论】:
您仍然可以先使用pod install
,它将只安装缺少的一个,而不接触其他的。虽然没有用例来更新您尚未安装的 pod,但是否存在?【参考方案3】:
现在是 2015 年
所以因为pod update SomePod
涉及最新版本的 cocoapods 中的所有内容,所以我找到了一种解决方法。
按照以下步骤操作:
从Podfile
中删除SomePod
运行pod install
pod 现在将从我们的项目和 Podfile.lock
文件中删除 SomePod
。
将SomePod
放回Podfile
再次运行pod install
这次我们将安装最新版本的 pod,并将其保存在Podfile.lock
。
【讨论】:
你也可以使用我这里回答的技巧***.com/questions/29901337/… 您也可以通过pod update somepod anotherpod thirdpod
一次更新多个 pod :)
这很聪明。您在两个独立的步骤中完成它们并依靠 podfile.lock 来保持其他依赖项完好无损。我只是想知道SomePod
是否已更新为其最新的依赖项,它不会将anotherPod
的共享依赖项更新为最新的吗?不管 podlock 中有什么,这不会发生吗?否则无法满足SomePod
的要求【参考方案4】:
要安装单个 pod 而不更新现有的 -> 将该 pod 添加到您的 Podfile 并使用:
pod install --no-repo-update
要删除/更新特定的 pod,请使用:
pod update POD_NAME
测试过!
【讨论】:
【参考方案5】:我正在使用 cocoapods version 1.0.1
并使用 pod update name-of-pod
效果很好。不会更新其他 Pod,只会更新您输入的特定 Pod。
【讨论】:
【参考方案6】:这有点离群,不太可能是 OP 处理的问题,但如果您在计算机上使用本地 pod,pod update <podname>
并非在所有情况下都有效。
在这种情况下,唯一会触发pod update
工作的是 podspec 文件是否发生更改。但是,进行更改也将使pod install
也能正常工作。
在这种情况下,您只需将描述或摘要等小部分修改一个字母,然后您就可以成功运行安装或更新命令。
【讨论】:
【参考方案7】:只是说:
pod install
- 用于安装新的 pod,
pod update
- 用于更新现有的 pod,
pod update podName
- 只更新特定的 pod 而不会触及其他 pod,
pod update podName versionNum
- 用于在不接触其他 pod 的情况下更新/降级特定 pod
【讨论】:
您的意思是pod
而不是git
?
有时不会,我不知道为什么。锻炼解决方案: 1. 从 Podfile 中删除特定 pod 2 .pod install 3. 将特定 pod 重新添加到 Podfile 4. pod install【参考方案8】:
您永远无法实现 100% 的隔离。因为一个 pod 可能有一些 shared 依赖关系,如果你尝试更新你的单个 pod,那么它也会更新其他 pod 的依赖关系。如果没问题,那么:
tl;博士使用:
pod update podName
为什么?阅读下文。
pod update
不会尊重 podfile.lock
。它将覆盖它——与单个 pod 相关
pod install
将尊重 podfile.lock
,但会尝试根据其锁定到的版本(在 Podfile.lock 中)安装 podfile 中提到的每个 pod。
此图有助于更好地理解差异:
主要问题来自~>
aka optimistic operator。
在Podfile
中使用精确版本是不够的
有些人可能认为,在 Podfile
中指定其 pod 的确切版本,例如 pod 'A', '1.0.0'
,足以保证每个用户都与团队中的其他人拥有相同的版本。
然后他们甚至可能使用pod update
,即使只是添加一个新的 pod,认为它永远不会冒更新其他 pod 的风险,因为它们已固定到 Podfile
中的特定版本。
但实际上,这不足以保证我们上述场景中的 user1 和 user2 将始终获得所有 pod 的完全相同的版本。
一个典型的例子是,如果 pod A
依赖于 pod A2
— 在 A.podspec
中声明为 dependency 'A2', '~> 3.0'
。在这种情况下,在 Podfile 中使用 pod 'A', '1.0.0'
确实会强制 user1 和 user2 始终使用 pod A 的 1.0.0 版本,但是:
3.4
版本的 pod A2
结束(因为那是 A2
当时的最新版本)
当用户2在稍后加入项目时运行pod install
时,他们可能会在版本3.5
中获得podA2
(因为A2
的维护者可能在此期间发布了一个新版本)。
这就是为什么确保每个团队成员在每个计算机上使用相同版本的所有 pod 的唯一方法是使用 Podfile.lock
并正确使用 pod install
与 pod update
。
以上摘录均来源于pod install vs. pod update
我也强烈推荐观看what does a podfile.lock
do
【讨论】:
【参考方案9】:pod update POD_NAME
将更新最新的 pod,但不会更新 Podfile.lock
文件。
因此,您可以使用特定版本的 pod 更新您的 Podfile,例如 pod 'POD_NAME', '~> 2.9.0'
,然后使用命令 pod install
稍后,您可以从 Podfile 中删除特定版本命名,并再次使用 pod install
。这将有助于保持Podfile.lock
的更新。
【讨论】:
以上是关于如何在不触及其他依赖项的情况下更新单个 pod的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL,如何在不创建重复项的情况下将数组更新为现有数组?
从 websockets 更新数据时,如何在不连接到每个子组件的情况下更新单个子组件?
如何在不更新依赖项 SonataUserBundle 的情况下安装 FOSUserBundle dev-master?