如何在不触及其他依赖项的情况下更新单个 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 版本,但是:

user1 可能以 3.4 版本的 pod A2 结束(因为那是 A2 当时的最新版本) 当用户2在稍后加入项目时运行pod install时,他们可能会在版本3.5中获得podA2(因为A2的维护者可能在此期间发布了一个新版本)。 这就是为什么确保每个团队成员在每个计算机上使用相同版本的所有 pod 的唯一方法是使用 Podfile.lock 并正确使用 pod installpod 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 更新数据时,如何在不连接到每个子组件的情况下更新单个子组件?

如何从 Xcode 项目中删除其中一个可可豆荚插件

如何在不更新依赖项 SonataUserBundle 的情况下安装 FOSUserBundle dev-master?

Maven:在不扩展依赖项的情况下使用 flatten 解析版本

如何在没有 POD 和 Carthage 的情况下添加 SideMenu?