在用cocoapods安装RestKit之后,我遇到了一个奇怪的问题。 在用cocoapods解决我的项目的RestKit依赖关系并试图构建它之后,我面临这个错误:

沙箱与Podfile.lock不同步。运行“pod install”或更新CocoaPods安装。

我试着运行pod安装,但没有变化。

以下是一些照片:

  PODS:
  - AFNetworking (1.3.3)
  - RestKit (0.20.3):
    - RestKit/Core
  - RestKit/Core (0.20.3):
    - RestKit/CoreData
    - RestKit/Network
    - RestKit/ObjectMapping
  - RestKit/CoreData (0.20.3)
  - RestKit/Network (0.20.3):
    - AFNetworking (~> 1.3.0)
    - RestKit/ObjectMapping
    - RestKit/Support
    - SOCKit
  - RestKit/ObjectMapping (0.20.3)
  - RestKit/Search (0.20.3):
    - RestKit/CoreData
  - RestKit/Support (0.20.3):
    - TransitionKit (= 1.1.1)
  - RestKit/Testing (0.20.3)
  - SOCKit (1.1)
  - TransitionKit (1.1.1)

DEPENDENCIES:
  - RestKit (~> 0.20.0)
  - RestKit/Search (~> 0.20.0)
  - RestKit/Testing (~> 0.20.0)

SPEC CHECKSUMS:
  AFNetworking: 61fdd49e2ffe6380378df37b3b6e70630bb9dd66
  RestKit: 1f181c180105a92f11ec4f6cd7de37625e516d83
  SOCKit: 2f3bc4d07910de12dcc202815e07db68a3802581
  TransitionKit: d0e3344aac92991395d4c2e72d9c5a8ceeb12910

COCOAPODS: 0.29.0

当前回答

首先,您必须了解Podfile。锁就是然后明白什么是Manifest。锁是什么,用在什么地方。

Podfile包含您拥有的每个依赖项的(乐观或精确)版本。锁文件只保存精确的版本。

一旦你安装了pod,所有的pod都会被下载/安装到/pods目录中。你可能想承认,也可能不想。这取决于你的团队。你的团队不能决定他们是否应该提交Podfile。锁不锁。这样团队中的每个开发人员都可以确保他们得到完全相同的版本。

假设您下载了团队的代码。在项目的根目录中,只有Podfile和Podfile。锁,Pods目录没有被提交。 然后执行pod install来创建Pods目录。每个pod的版本快照应该与Podfile.lock中所有pod的版本相匹配。 CocoaPods有一个安全检查,以确保匹配的版本

这就是舱单。锁开始发挥作用。清单。Lock是本地机器创建的锁。它必须与Podfile匹配。在你的repo中,由最后一次提交(导致你的pods的变化)生成的锁。如果不匹配,那就有问题了。

关于清单的文件。锁文件为:

  #     Manifest.lock: A file contained in the Pods folder that keeps track of
  #     the pods installed in the local machine. This files is used once the
  #     exact versions of the Pods has been computed to detect if that version
  #     is already installed. This file is not intended to be kept under source
  #     control and is a copy of the Podfile.lock.

老实说,我只能想到一种情况Manifest。锁和Podfile。锁将不同步:

我的意思是如果你从main分支中拉,你会得到main的Podfile和lock file。如果你对Podfile进行了更改,然后运行pod install,那么你将更新Podfile。锁定和清单。锁定并保持它们同步。没有问题

这样是否可以:

您和您的团队不提交/Pods目录 您的Podfile或Podfile中存在合并冲突。锁上,但没有意识到。或者你没有同时提交Podfile和Podfile.lock 假设Xcode不处理Podfile和Podfile。锁定后,您的项目自然可以成功构建。 然而,如果你去检查你的目标的构建阶段,你会看到以下内容

这里记录了该脚本

#     Adds a shell script build phase responsible for checking if the Pods
#     locked in the Pods/Manifest.lock file are in sync with the Pods defined
#     in the Podfile.lock.
#     
#     @note   The build phase is appended to the front because to fail fast.
#     
#     @return [void]

这些行所做的是:执行一个diff并确保您的Manifest。例如,所有已安装pod版本的本地快照都等于Podfile。锁定,即您的回购当前所有已安装pod版本的快照。

修复可能超级简单,只要确保你的Podfile是你想要的。然后运行pod install。你也不小心改变了你的清单。锁在你的/Pods目录中(或者如前所述,可能只提交锁文件而不提交Podfile,反之亦然)。删除/Pods目录不会造成伤害。然后再做一个吊舱安装。不要更新吊舱,除非你想这么做。

只要确保你没有删除Podfile。锁定,否则如果你做pod安装,那么它将更新所有依赖到最新版本。


这段关于锁文件的视频也很有帮助,CocoaPods文档介绍了锁文件在pod安装和pod更新中的不同用法,最后详细介绍了如何使用所有这些逻辑 这个关于校验和的艺术博客。值得注意的是,单个空格将创建一个新的校验和,并可能使内容不同步。

其他回答

你能试试这个吗:

删除Pods文件夹 删除Podfile.lock 运行pod安装 清洁+建造

对我来说,这是Ruby版本号的问题。

我得到了错误:

The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.

在尝试了一百万件事情之后,包括这个线程中包含的大部分内容,我最终破解了位于:usr/local/bin/pod的pod文件

我更正了第一行,以指向我的机器上实际存在的ruby版本。我改变了:

#!/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby

to

#!/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby

经过几天的努力,从3级到6级一切都解决了。

确保pod配置文件已设置。

请执行以下步骤:

1:删除Podfile。锁定文件在您的项目文件夹

2:删除项目文件夹中的Pods文件夹

3:在项目文件夹中执行“pod install”

4:在Xcode中进行“Clean”

5:重建你的项目

在项目中检查pod可能没有被推送到Git。所以很明显compile将会崩溃,因为它无法找到Pods目录

 diff "${PODS_ROOT}/../../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null

我通过在终端中导航到我的项目目录后发出pod install来解决这个问题。

事实上,我有一个错误无法找到pod命令,这意味着cocoapods没有安装。这是通过gem install cocoapods来修复的。如果遇到依赖项错误,只需安装报告丢失的每个命令。在我的情况下,我必须更新Ruby,在cocoapods正确安装后,我可以使用命令舱安装。

PS.如果你有pod目录,尝试pod更新。也许你的库需要更新。