转载

Check Pods Manifest.lock

初次看到这个题目的你,可能还不了解这是个啥。但是,我想下面这个错误提示,你肯定会非常熟悉:

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

没错,当我们使用 cocoapods 的时候,经常会遇到的一个问题。其原因在于我们本地的 manifest.lock 和通过 git 同步的 Pod.lock 的产生了差异。

注:manifest.lock简单可以理解为我们在本地执行一次 pod install 后生成的当前Podfile的状态的表征文件。而Pod.lock是同步他人更新过Podfile后的状态。

那么,这个差异报错的原因是什么呢?我们可以打开Xcode项目中对应的 TargetBuild Phase ,可以发现,其中存在在一项名为 Check Pods Manifest.lock ,是一个 shell script ,内容如下:

// 1. diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null  // 2. if [[ $? != 0 ]] ; then  // 3.     cat << EOM error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation. EOM     exit 1 fi 

我们来解读下这段代码的意思:

  1. 通过diff命令来检查 Podfile.lockManifest.lock 的区别。这个命令中的 > /dev/null 可以视为一个 黑洞 ,等价于一个只读文件,所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到。由于在执行 diff 命令的过程中可能产生大量的标准输出,可能会干扰我们的的工作流程执行,所以我们将它们全部丢弃给 黑洞 ,只关心 返回值

  2. if [[ $? != 0 ]] then 这个命令指的上一个命令的返回值如果不等于0,就执行xxxx。其中$?也就代表着上一个命令 diff 的返回值。

  3. 好,如果返回值不为0,说明有差异,因此通过 cat << EOMEOM 将处于这两者之前的内容输出到标准输出。

改造脚本

好,既然我们已经读懂了上述的 shell script ,我们不如将这个错误的提示来进行整改,当有差异的情况下,自动去进行 pod install

整体改造后的代码如下:

// 1. diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null  // 2. if [[ $? != 0 ]] ; then  // 3.     pod install --project-directory="${PODS_ROOT}/../" fi 
原文  http://satanwoo.github.io/2016/02/27/check-manifest/
正文到此结束
Loading...