如何处理大型Swift项目?

Ale*_*tyy 53 xcode compilation ios swift

在我用Swift编写的iPhone应用程序变得非常大(> 150 .swift文件+各种Objective-C库)后,Xcode开始表现得非常糟糕:

  • 每一次编译我都会遇到各种错误,例如:

    Command failed due to signal: Segmentation fault: 11

  • 编辑需要花费大量时间(MacBook Pro Retina上> 2分钟)
  • 等等.

我只是想知道每个人是否都有同样的问题,也许有人找到了减少这种噩梦的方法?

到目前为止我做了什么 - 我将项目拆分为几个动态框架,我从主项目链接,它有助于减少编译时间,但引入一些新问题.

我还使用iRamDisk将DerivedData文件夹保存在RAM中并定期从中删除所有文件,它有时会导致SourceKit崩溃.

Dan*_*ele 58

Swift工具链仍然有点粗糙,你需要使用一些临时的解决方法,直到Apple修复它(参见下面的更新)

这是您可以做的一些项目清单,以防止您发疯.

由不成熟的Swift编译器引起的缓慢

  • 使用Injection for Xcode更改开发工作流程.安装插件后,您将能够在模拟器\设备中注入代码更改,而无需重新编译.您不需要在项目中硬编码\修改任何内容.我们最近开始在工作中使用它,它对我们的方面产生了巨大的影响,即使它不适用于每个用例(例如,你不能创建新的功能,你只能修改现有的功能).

  • 编译器不喜欢的一些特定代码构造,需要花费太多时间进行编译.最常见的问题是类型检查器根据需要执行的类型检查以指数方式减慢编译时间(在此处阅读更多实际示例,此处有详细说明).为了确定您是否遇到此问题,您可以关注此博客文章,您将通过使用一些编译器附加标志来收集有关创建缓慢的函数的信息.或者,您可以使用此Xcode插件来识别构建缓慢的来源.

  • 在有意义的地方明智地使用动态框架.只有在修改其中一个Swift文件时才会进行框架重新编译(动态框架仅适用于iOS> = 7).

  • 压缩相同文件中的代码.降低Swift文件的数量可以明智地加快编译过程.您可以轻松地实现它通过增加一个用户自定义标记使"整个模块优化" SWIFT_WHOLE_MODULE_OPTIMIZATION并将其设置为YES,并在同一时间设置优化级别为none(禁用优化,将使其慢)过时 您可以考虑使用此要点,它是一个构建脚本,它会折叠"merge.swift"文件中的所有代码.你需要为它创建一个新目标,但值得一试.

  • 仔细检查这里列出的东西(还有一些更多的misc原因,因为编译很慢)

  • 过时的 尝试本博文中描述的方法,它涉及创建生成make文件的构建脚本.它需要对构建脚本进行手动干预(它包含swift文件列表).

  • 过时的 尝试这种被黑客攻击的增量编译技术

更新:Swift 1.2(Xcode 6.3)上引入的增量构建

Apple最终使用Swift 1.2(Xcode 6.3附带)推出了增量版本.它还不完美,但它是一个巨大的进步.

从现在开始,只有在更改类时(或者当它所依赖的类之一已被更改时)才重新编译类.但是,编译器仍然无法理解类的更改是否与其接口有关.因此,对类的任何类型的更改都会导致重新编译该类及其所有依赖项.

更新:仅在Swift 2.1(Xcode 7.1)上引入公共接口更改时重新编译依赖类

从Swift 2.1(Xcode 7.1)开始,只有在更改类的公共接口时才会重新编译依赖类,而不是在每次更改时都重新编译.这对于大型项目尤其如此.

项目(错误)配置(与Swift无关)

  • 确保"仅构建活动体系结构"为"是"以进行调试.
  • 确保您没有添加花费太多时间的pre\post编译脚本.