如何处理大型Swift项目?

时间:2015-01-19 19:54:12

标签: ios xcode swift compilation

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

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

    Command failed due to signal: Segmentation fault: 11

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

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

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

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

6 个答案:

答案 0 :(得分:58)

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

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

由未成熟的Swift编译器

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

  • 编译器不喜欢的一些特定代码构造,需要花费太多时间进行编译。最常见的问题是类型检查器会根据需要执行的类型检查以指数方式减慢编译时间(对于实际示例,请阅读更多here,有关详细说明,请阅读here)。为了确定您是否遇到此问题,可以按照此blog post进行操作,您将通过使用一些编译器附加标志来收集有关创建缓慢的函数的信息。或者,您可以使用此Xcode plugin来确定构建缓慢的来源。

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

  • 压缩相同文件中的代码。降低Swift文件的数量可以明智地加快编译过程。你可以很容易地实现它'#34;整个模块优化&#34;通过添加用户定义的自定义标志 SWIFT_WHOLE_MODULE_OPTIMIZATION 并将其设置为YES,同时将优化级别设置为none(禁用会使其变慢的优化) OUTDATED < del>您可以考虑使用这个gist,它是一个构建脚本,可以折叠&#34; merge.swift&#34;中的所有代码。文件。 你需要为它创建一个新目标,但值得一试 尝试。

  • 仔细检查列出的内容here(由于编译速度慢,还有一些更多的misc原因)

  • OUTDATED 尝试使用此blog post中描述的方法,它涉及创建生成make文件的构建脚本。它需要对构建脚本进行手动干预(它包含swift文件列表)。

  • OUTDATED 尝试this黑客增量编译技术

更新: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无关)

  • 确保&#34;仅构建活动架构&#34;是调试是。
  • 请确保您没有添加花费太多时间的前\后编译脚本。

答案 1 :(得分:2)

Apple有一些建议可以加快Technical Note 2190中的Xcode构建速度。您是否考虑过creating and precompiling an own framework外包未更改的Swift模块或部分/全部Objective-C代码?

删除Swift中的所有类型推断。

This SO topic有一些好主意,而blog post建议

  1. 停止生成dSYM捆绑包和
  2. 如果使用Clang,请避免使用-O4进行编译。
  3. 虽然很多这些改进都与Objective-C有关,但我很确定,其中一些仍与Swift相关。

答案 2 :(得分:2)

(重新)编译是一个已知问题,我相信很快就会解决。一些建议:

  • 尽可能使用Objective C - 即使它是Swift项目的一部分,它也可以快速编译
  • 将代码拆分为框架
  • 指定类型而不是将其留给编译器来推断它们

同样,很有可能很快就会解决这个问题,所以也许最好不要在此时重写代码或重新组织代码。

答案 3 :(得分:1)

你可以尝试:

  • 升级计算机中的RAM量
  • 如果您有多个.swift文件在同一个视图控制器上执行操作,请尝试将它们压缩为每个视图控制器的一个.swift文件
  • 调整编译源下的设置以查看是否有任何重复项,或者是否有任何脚本或设置可以添加以使其编译更快...

您还可以查看this帖子的答案,了解您可以采取哪些措施来减慢编译时间

答案 4 :(得分:1)

我发现分段错误和编译速度慢的主要原因之一是硬编码大数组和字典,特别是在将它们声明为全局常量并尝试从另一个.swift文件中访问它们的值时。当我将所有数据存储在plists中时,这些问题就消失了。

答案 5 :(得分:0)

以我的经验,请避免创建大的swift文件 ,当我在新公司中启动项目时,有一个“ UIViewController”,其中包含多个2000行,对该文件进行的少量更改需要花费大量时间来构建,我用extension中的<500行进行了4 class s的运行,我的速度提高了很多。