xcode 如何处理大型Swift项目?

unguejic  于 2022-12-27  发布在  Swift
关注(0)|答案(6)|浏览(150)

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

  • 每隔一次编译,我就会得到各种错误,例如:

第一个月

  • 编译需要大量的时间(〉2分钟的MacBook Pro视网膜)
  • 等等。

我只是想知道是不是每个人都有同样的问题,也许有人找到了减少这场噩梦的方法?
到目前为止我所做的-我把项目分成几个动态框架,我从主项目链接,这有助于减少编译时间,但引入了一些新的问题。
我还使用iRamDisk将DerivedData文件夹保存在RAM中,并定期从中删除所有文件,它有时有助于SourceKit崩溃。

cx6n0qe3

cx6n0qe31#

Swift工具链仍然有点粗糙,你需要使用一些临时的解决方案,直到苹果修复它(见下面的更新
这里有一个清单,你可以做,以防止自己疯了。

Swift编译器不成熟导致的速度缓慢

  • 使用Injection for Xcode更改您的开发工作流。一旦您安装了该插件,您将能够在模拟器\设备中注入代码更改,而无需重新编译。您不需要硬编码或修改项目中的任何内容。我们最近开始在工作中使用它,它对我们产生了巨大的影响,即使它并不适用于每个用例(例如,您不能创建新功能,只能修改现有功能)。
  • 编译器不喜欢某些特定的代码结构,并且需要花费太多的时间来编译。最常见的问题是类型检查器,它根据需要执行的类型检查的数量以指数方式降低编译时间(阅读更多这里的实际例子和here的详细解释)。为了确定你是否遭受这个问题,你可以按照这个blog post,你将通过使用一些编译器附加标志来收集关于创建缓慢的函数的信息。或者你可以使用这个Xcode plugin来识别构建缓慢的来源。
  • 在有意义的地方明智地使用动态框架。只有当你修改Swift文件时,框架才会重新编译(动态框架只适用于iOS〉= 7)。
  • 将代码压缩到相同的文件中。减少Swift文件的数量可明显加快编译过程。通过添加用户定义的自定义标志 SWIFT_WHOLE_MODULE_OPTIMIZATION 并将其设置为YES,同时将优化级别设置为none,您可以轻松实现“整个模块优化(禁用会使其变慢的优化)过时您可以考虑使用gist,它是一个构建脚本,可以将所有代码折叠到“merge.swift”文件中。您需要为它创建一个新的目标,但值得一试。
  • 仔细检查here列出的内容(还有一些其他原因,因为编译速度慢)
    *过时尝试blog post中描述的方法,它涉及到创建一个生成make文件的构建脚本。它需要手动干预构建脚本(它包含swift文件列表)。
    *过时尝试this破解增量编译技术
    更新:Swift 1.2(Xcode 6.3)上引入了增量构建

苹果终于在Swift 1.2(随Xcode 6.3一起发布)中引入了增量构建,虽然还不完美,但已经是一个巨大的进步。
从现在开始,类只有在它被修改时(或者当它所依赖的类之一被修改时)才会被重新编译。然而,编译器仍然无法理解类的修改是否是针对它的接口的。因此,对类的任何修改都会导致该类及其所有依赖项的重新编译。

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

从Swift 2.1(Xcode 7.1)开始,只有当你改变类的公共接口时,依赖类才会被重新编译,而不是每次改变都被重新编译,这对大项目来说是一个巨大的不同。

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

  • 确保调试时“仅构建活动体系结构”为YES。
  • 请确保没有添加占用太多时间的编译前\编译后脚本。
vkc1a9a2

vkc1a9a22#

苹果有一些建议来加快你在Technical Note 2190中构建Xcode的速度。你有没有考虑过creating and precompiling an own framework来外包未改变的Swift模块或部分/全部Objective-C代码?
删除Swift中的所有类型推理。
This SO topic有一些很好的想法,这个blog post建议
1.停止生成dSYM捆绑包并
1.如果使用Clang,请避免使用-O4进行编译。
虽然很多改进都与Objective-C有关,但我敢肯定,其中一些仍然与Swift相关。

jexiocij

jexiocij3#

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

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

同样,这个问题很有可能很快得到解决,所以现在最好不要在重写或重新组织代码方面投入太多资金。

9rygscc1

9rygscc14#

你可以试试:

  • 升级计算机中的RAM容量
  • 如果你有多个.swift文件在同一个视图控制器上做事情,试着把它们压缩成一个.swift文件每个视图控制器
  • 正在调整编译源下的设置,以查看是否有任何重复项,或者是否有任何脚本或设置可以添加以使其编译更快...

你也可以看一下this post的答案,以获得一些关于你可以做些什么来降低编译时间的提示

bxjv4tth

bxjv4tth5#

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

r55awzrz

r55awzrz6#

根据我的经验,避免创建大的swift文件,当我在新公司开始一个项目时,有一个超过2000行的“UIViewController”,对这个文件做一些小的修改需要花费很多时间来构建,我从class中创建了4个小于500行的extension,我的速度提高是令人难以置信的。

相关问题