如何处理大型的Swift项目?
在Swift中编写的iPhone应用程序变得相当大(> .swift文件+各种Objective-C库)后,Xcode开始performance得相当糟糕:
-
每第二次编译我会得到各种错误,例如:
Command failed due to signal: Segmentation fault: 11
- 编译需要大量的时间(在MacBook Pro Retina上> 2分钟)
- 等等。
我只是想知道每个人是否有同样的问题,也许有人find了一种方法来减less这种噩梦?
到目前为止,我所做的工作是将项目拆分成几个与主项目链接的dynamic框架,有助于减less编译时间,但会引入一些新的问题。
我还使用iRamDisk将DerivedData
文件夹保存在RAM中,并定期从中删除所有文件,它有时可以帮助SourceKit崩溃。
Swift工具链仍然有点粗糙,你需要使用一些临时的解决方法,直到苹果修复它(见下面的更新 )
这里列出了你可以做的事情,以防止发疯。
不成熟的Swift编译器引起的缓慢
-
使用Injection for Xcode更改您的开发工作stream程。 一旦你安装了插件,你将能够在你的模拟器\设备中注入代码更改, 而无需重新编译。 你不需要硬编码\修改你的项目中的任何东西。 我们最近开始在工作中使用它,它对我们产生了巨大的影响,即使它不适用于每个用例(例如,您不能创build新的function,只能修改现有的function)。
-
一些特定的代码构造,编译器不喜欢,花费太多的时间来编译。 最常见的问题是types检查器会根据需要执行多lesstypes检查以指数方式减慢编译时间(有关实际示例和此处的详细说明,请参阅此处 )。 为了确定你是否受到这个问题的困扰,你可以关注这个博客post ,你将通过使用一些编译器附加标志来收集关于创build缓慢的函数的信息。 或者,你可以使用这个Xcode插件来识别构build缓慢的来源。
-
明智地使用dynamic框架,这是合理的。 只有修改其中的一个Swift文件(dynamic框架仅适用于iOS> = 7),才能完成框架重新编译。
-
在相同的文件中凝结代码。 降低Swift文件的数量可以加快编译过程的速度。 通过添加用户定义的自定义标志SWIFT_WHOLE_MODULE_OPTIMIZATION并将其设置为YES,并同时将优化级别设置为无(以禁用使其变慢的优化),可轻松实现“整个模块优化” 。OUTDATED
您可能会考虑使用这个要点 ,它是一个构build脚本,将所有代码合并到“merge.swift”文件中。 你需要为它创build一个新的目标,但是值得一试。 -
仔细检查这里列出的东西 (有一些更多的杂项原因,因为编译速度慢)
-
过时的
尝试在这个博客文章中描述的方法,它涉及到创build一个构build脚本,生成一个make文件。 它需要手动干预构build脚本(它包含swift文件的列表)。 -
过时的
试试这个黑客渐增的编译技术
更新:在Swift 1.2(Xcode 6.3)上引入的增量构build
苹果公司最终推出了Swift 1.2(与Xcode 6.3一起发行)的增量版本。 这并不完美,但是这是一个巨大的进步。
从现在开始,一个类只有在被改变的时候才被重新编译(或者当它所依赖的一个类被改变时)。 然而编译器仍然无法理解一个类的变化是否在其接口上。 所以对类的任何改变都会导致该类及其所有依赖项的重新编译。
更新:仅在Swift 2.1(Xcode 7.1)上引入公共接口更改时重新编译依赖类
从Swift 2.1(Xcode 7.1)开始,依赖类只有在更改类的公共接口时才会重新编译,而不是每次更改。 这对于大项目来说尤其如此。
项目(错误)configuration(与Swift无关)
- 确保“Build Active Only”仅适用于debugging。
- 确保你没有添加花费太多时间的编译前脚本。
在技术说明2190中, Apple提供了一些加速Xcode构build的build议。 你有没有想过创build和预编译自己的框架外包不变的Swift模块或一些/所有的Objective-C代码?
删除Swift中的所有types推断。
这个SO主题有一些不错的想法,这个博客文章build议
- 停止生成dSYM捆绑和
- 如果使用Clang,避免使用
-O4
编译。
尽pipe很多这些改进都与Objective-C有关,但我确定它们中的一些仍然与Swift相关。
(重新)编译是一个已知的问题,我相信很快就会解决。 一些build议:
- 尽可能使用Objective C – 即使它是Swift项目的一部分,也可以快速编译
- 将代码拆分为框架
- 指定types而不是让编译器来推断它们
同样,这个问题很快就会得到解决,所以最好不要在这个时候重写或者重组代码。
你可以尝试:
- 升级计算机中的RAM数量
- 如果您有多个.swift文件在同一个视图控制器上执行操作,请尝试将它们压缩成一个.swift文件视图控制器
- 调整编译源下的设置,看看是否有任何重复,或者是否有任何脚本或设置,您可以添加,使其编译更快…
你也可以看看这个post的回答,提供一些提示,告诉你如何减慢编译时间
我发现分段错误和编译速度慢的主要原因之一是对大数组和字典进行硬编码,特别是在将它们声明为全局常量并试图从另一个.swift文件中访问它们的值时。 当我将所有这些数据存储在plists中时,这些问题都消失了。