Xcode 自定义 shell 脚本正在减慢编译时间

Posted

技术标签:

【中文标题】Xcode 自定义 shell 脚本正在减慢编译时间【英文标题】:Xcode custom shell scripts are slowing down the compiling time 【发布时间】:2013-12-18 03:45:53 【问题描述】:

每当我构建时,测试对我的 Xcode 项目所做的任何更改已成为一项耐心练习。编译完所有源文件后,我在 Xcode 顶部的活动窗口中收到以下消息:

“运行 3 个自定义 Shell 脚本中的 3 个”

我没有添加任何我自己的自定义 shell 脚本,但是我通过 Cocoapods 使用了很多依赖项,并且我使用了 2 个框架作为构建环境,Crashlytics 和 Tapstream。 Crashlytics 要求您在构建阶段添加一个运行脚本,除此之外我不知道其他脚本来自哪里,它们似乎是我构建时间的瓶颈。

谁能告诉我发生了什么以及如何加快速度?

【问题讨论】:

它的 Xcode ;)。我认为这是他们唯一不以小写字符开头的产品。 我遇到了同样的问题,我在这里发布了我的案例的解决方案:***.com/questions/40531545/…。 【参考方案1】:

我无法启发你,但我可以告诉你我是如何阻止我的运行的。这也发生在安装 Cocoapods 之后。在我的主要项目的Target 中,在Build Phases 下,我注意到有两个条目名为Check Pods Manifest.lock,另一个名为Copy Pods Resources

在两者下都有一个未选中的选项Run script only when installing。我检查了两者,至少现在我的项目在不运行脚本的情况下构建并运行良好。

这是一个糟糕的答案,因为我无法真正为您提供更多信息,而且它甚至可能不适用于您的情况,所以希望有人能来启发我们。


可能的外部捆绑包问题

所以我只是在调试 pod 安装库的 NSLocalized 字符串文件不工作的问题时遇到了令人沮丧的经历。原来是因为我检查了上面提到的选项。 Pods-resources.sh,它有安装包的行,没有在调试模式下运行。它只在安装时运行 - 当然!有什么要注意的。

关于这个问题的更多信息:

NSLocalizedStringFromTable not working in CocoaPod dependency

【讨论】:

我已经在这种艰难的步伐下发展了一年,我已经忘记了能够按构建和运行而没有时间纳税、理发、开始工作是什么感觉乐队,也许可能会去厕所,然后回来告诉我它在写剧本……我欠你的,谢谢 我是 xcode 的新手——当你说 Target 时,你指的是项目的“编辑方案”,那么在哪里?我找不到要取消选中的 Pod 相关内容。 @Gerry 你在你的项目中使用 cocoapods 吗? 我找到了项目设置(点击项目窗口中的项目名称)。是的,我和我一起工作的人设置项目并使用 cocoapods 和构建时间很糟糕。 如果您将其设置为“仅在安装时运行”,它似乎又好又快,但如果您是从干净的、非派生的数据状态构建的,您可能没有本地化的字符串或 xcasset。但是如果您正在进行大量迭代,您可以重新打开它,并且派生数据/缓存应该保留您需要的资产.. 只需确保下次您必须关闭该选项时是否进行清理 【参考方案2】:

为了解决“复制 pod 资源”缓慢的问题,我想出了一个解决方案,只复制以前没有复制过的资源。

为此,我们必须修补由 cocoapods 创建的 *-resources.sh 文件,以便复制过程仅在目标目录中生成的文件不存在时才会发生(它是在第一次复制时创建的)。只要此目标目录存在并包含此自动生成的文件,就会跳过复制资源阶段。这在我的项目中节省了大约 30 秒(当然取决于您的项目大小)。为此,请执行以下操作:

在您的项目根目录中创建一个名为“copy_pod_resources_once.patch”的补丁文件,其中包含以下内容:

5a6,13
> NONCE_FILE="$TARGET_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/copyresources-done.nonce"
> if [ -f "$NONCE_FILE" ]; then
>    echo "already copied resources"
>    exit 0
> else
>    touch "$NONCE_FILE"
> fi
> 

在项目的 Podfile 中添加以下安装后挂钩:

post_install do |installer_representation|
    system('find "./Pods/Target Support Files" -name "*-resources.sh" | xargs -I patch -p0  -i ./copy_pod_resources_once.patch')

    <other post install stuff>
end

【讨论】:

@werner-altewischer 你应该在 Github 上的 cocoapods 项目中为此提交 PR! @Werner Altewischer 我创建了补丁文件并复制了您要求包含的内容并修改了 pod 文件。但是构建时间并没有减少。我可能会错过什么? 这只会减少“复制 pod 资源”阶段的时间,不会减少构建过程的其他部分。您是否在后续构建的构建日志中看到“已复制资源”的声明(不是第一个,因为最初必须复制资源)?如果是这样,补丁正在运行。 @WernerAltewischer 感谢您提出的补丁!非常好的主意。我只是好奇:既然你在使用这个,你有没有遇到过这个变化引起的问题?干杯。 我在 CocoaPods 第 2439 期发表了最后一条评论,这正是我的想象。出色的工作,非常感谢你。绝对考虑作为补丁提供给 CP。【参考方案3】:

对我来说,它是 Crashlytics。有一些突出的变化,因为 Crashlytics 会自动更新其文件。我重置/删除了它们并重建并通过了它。

所以一般的答案可能是检查任何第三方组件并确保它们正常工作。

【讨论】:

您能否更具体地说明您重置了哪些文件?【参考方案4】:

正如拉姆塞尔在这个答案中所说, https://***.com/a/21318086/1752988 在尝试了大多数其他解决方案之后,我还去了 Build Phases 并清除了所有可能的 POD 链接,并且清除了显示的关于 Pod 的三个构建问题。

但是,XCode 项目导航器下没有列出的一个文件丢失了,但它们位于已下载的 Git Zip 文件夹中!很明显,我复制它并放入XCode项目并尝试运行它运行干净! :)

【讨论】:

【参考方案5】:

我的项目中遇到了类似的问题(但没有使用 Cocoapods)。它最终成为 Xcode (Spritebuilder) 外部的应用程序在崩溃时以某种方式占用我的 Xcode 项目中的资源的问题。我强制关闭非 xcode 应用程序,现在问题消失了

【讨论】:

【参考方案6】:

检查您的项目文件夹名称是否有空格。因为空格会在“SRCROOT”之类的目录路径中产生问题。我删除了空格并且项目运行正常。

【讨论】:

【参考方案7】:

我发现这种情况经常发生在我身上。确切原因未知,但似乎正在 git 分支之间切换,这些分支在使用的 pod 上存在差异。在我的情况下,只需触摸 Pods-xxx-Resources.sh shell 脚本文件即可使其加快备份速度。

【讨论】:

【参考方案8】:

可能对你不起作用,但清理项目为我修复了它(产品 -> 清理)

【讨论】:

以上是关于Xcode 自定义 shell 脚本正在减慢编译时间的主要内容,如果未能解决你的问题,请参考以下文章

XCode 8 卡在运行 4 个自定义 Shell 脚本中的 2 个

从 Xcode 运行时,Shell 脚本不会完全执行

python shell脚本使用cpulimit来减慢自私应用程序(确实需要安装cpulimit)

运行自定义 shell 脚本 '[cp] embed pods frameworks' 没有这样的文件或目录

Xcode 6 中的 Shell 脚本调用错误

自定义 Spring Boot 启动脚本