Ios Xcode 11重新编译太多
Xcode 11正在重新编译(几乎?)我的整个项目,即使我只是更改了一个局部私有变量,或者在局部范围内更改了一个常量的值,有时甚至在局部私有函数范围内。我有时可以像预期的那样通过快速构建进行2到3次更改,但很快它就决定重新编译所有内容(这需要很长时间) 你知道会发生什么吗?Xcode无法确定更改了什么,为什么要重新编译这么多其他东西(甚至其他模块)Ios Xcode 11重新编译太多,ios,swift,xcode,xcodebuild,xcode11,Ios,Swift,Xcode,Xcodebuild,Xcode11,Xcode 11正在重新编译(几乎?)我的整个项目,即使我只是更改了一个局部私有变量,或者在局部范围内更改了一个常量的值,有时甚至在局部私有函数范围内。我有时可以像预期的那样通过快速构建进行2到3次更改,但很快它就决定重新编译所有内容(这需要很长时间) 你知道会发生什么吗?Xcode无法确定更改了什么,为什么要重新编译这么多其他东西(甚至其他模块) 非常感谢您的建议,谢谢 这里没有黄金子弹,但有很多东西需要检查: 确保您在方案中实际使用了调试配置 请参阅下文,了解如何确保按照matt的建议使用
非常感谢您的建议,谢谢 这里没有黄金子弹,但有很多东西需要检查:
- 确保您在方案中实际使用了调试配置
- 请参阅下文,了解如何确保按照matt的建议使用增量构建而不是整个模块。还要确保调试生成的优化级别为“无”。
- 如果您使用的是RxSwift等类型推断密集的框架,那么添加显式类型注释可以加快构建时间
如果您提供关于该项目的更多细节,可能会有所帮助:您是否静态链接了任何库?它是框架还是应用程序目标?您使用的swift版本有多大?您是否有任何定制的构建阶段,例如有时可以跳过的linter或代码生成?我们也遇到了同样的问题,我们已经解决了它。两次 增量生成(相同生成计算机): 之前:~10米 之后:~35秒 怎样? 让我们先从我们的经验开始。我们有一个庞大的Swift/Obj-C项目,这是主要的问题:构建时间很慢,您必须创建一个新项目来实现一个新功能(字面上)。永不工作的语法突出显示的额外点数 理论 要真正解决这个问题,您必须真正了解构建系统的工作原理。 例如,让我们尝试以下代码片段:
import FacebookSDK
import RxSwift
import PinLayout
想象一下,您在文件中使用了所有这些导入。这个文件还依赖于另一个文件,它依赖于另一个库,而另一个库又使用另一个库等等
因此,要编译您的文件,Xcode必须编译您提到的每个库以及它所依赖的每个文件,因此,如果您更改其中一个“核心”文件,Xcode必须重建整个项目
Xcode构建是多线程的,但它由许多单线程树组成
因此,在每次增量构建的第一步,Xcode都要决定哪些文件必须重新编译并构建一个新文件。如果您更改了在其他文件上充当“可靠”的文件,则必须重新编译充当“依赖”的所有其他文件
因此,第一个建议是降低耦合。您的项目部分必须相互独立
Obj-C/Swift桥
这些树的问题如果使用Obj-C/Swift桥接器,Xcode必须经历比通常更多的阶段:
完美世界:
import PinLayout
final class TestViewController: UIViewController {
}
扰流板:Cocoapods将编译此代码,因为Cocoapods将导入PinLayout(包括UIKit)的每次导入,而SwiftPM不会,因为SwiftPM以原子方式导入框架
肮脏的黑客
还记得Xcode构建是多线程的吗
如果你能够将你的项目分割成许多独立的部分,并将它们作为独立的框架导入到你的项目中,你就可以滥用它。它确实降低了耦合,这实际上是我们使用的第一个解决方案,但实际上并不十分有效,因为我们只能将增量构建时间减少到~4-5m,与第一种方法相比,这算不了什么。我建议:确保使用增量构建而不是整个模块优化来调试构建。退出并清除衍生数据。更新到Xcode 11.4,它有时编译得很快,我甚至看不到它发生。这个线程可能会回答你的问题:它非常依赖于项目,它需要分析正在发生的事情的构建日志。我在Xcode 11.2+中没有观察到这种行为,而我有非常大的项目。您是否会以某种方式提供对项目源的访问,否则所有建议都毫无意义?请检查旧版生成系统属性,如果您没有修改子模块,则应取消选中该属性祝您好运,伙计。分享您在项目中降低耦合的经验。再见!你们有什么方法可以找到给定文件的依赖项吗?为什么“不优化”而不是“速度优化”?第二个不是为构建速度而优化的?@RomuloBM不,它是为代码执行时的速度/性能而优化的