Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Xcode 11重新编译太多_Ios_Swift_Xcode_Xcodebuild_Xcode11 - Fatal编程技术网

Ios Xcode 11重新编译太多

Ios Xcode 11重新编译太多,ios,swift,xcode,xcodebuild,xcode11,Ios,Swift,Xcode,Xcodebuild,Xcode11,Xcode 11正在重新编译(几乎?)我的整个项目,即使我只是更改了一个局部私有变量,或者在局部范围内更改了一个常量的值,有时甚至在局部私有函数范围内。我有时可以像预期的那样通过快速构建进行2到3次更改,但很快它就决定重新编译所有内容(这需要很长时间) 你知道会发生什么吗?Xcode无法确定更改了什么,为什么要重新编译这么多其他东西(甚至其他模块) 非常感谢您的建议,谢谢 这里没有黄金子弹,但有很多东西需要检查: 确保您在方案中实际使用了调试配置 请参阅下文,了解如何确保按照matt的建议使用

Xcode 11正在重新编译(几乎?)我的整个项目,即使我只是更改了一个局部私有变量,或者在局部范围内更改了一个常量的值,有时甚至在局部私有函数范围内。我有时可以像预期的那样通过快速构建进行2到3次更改,但很快它就决定重新编译所有内容(这需要很长时间)

你知道会发生什么吗?Xcode无法确定更改了什么,为什么要重新编译这么多其他东西(甚至其他模块)


非常感谢您的建议,谢谢

这里没有黄金子弹,但有很多东西需要检查:

  • 确保您在方案中实际使用了调试配置

  • 请参阅下文,了解如何确保按照matt的建议使用增量构建而不是整个模块。还要确保调试生成的优化级别为“无”。

  • 如果您使用的是RxSwift等类型推断密集的框架,那么添加显式类型注释可以加快构建时间

  • >P>如果项目很大,可以考虑将源文件的逻辑组重构为框架,但这可能比您更喜欢

    的变化过于剧烈。

如果您提供关于该项目的更多细节,可能会有所帮助:您是否静态链接了任何库?它是框架还是应用程序目标?您使用的swift版本有多大?您是否有任何定制的构建阶段,例如有时可以跳过的linter或代码生成?

我们也遇到了同样的问题,我们已经解决了它。两次

增量生成(相同生成计算机):

之前:~10米 之后:~35秒

怎样? 让我们先从我们的经验开始。我们有一个庞大的Swift/Obj-C项目,这是主要的问题:构建时间很慢,您必须创建一个新项目来实现一个新功能(字面上)。永不工作的语法突出显示的额外点数

理论 要真正解决这个问题,您必须真正了解构建系统的工作原理。 例如,让我们尝试以下代码片段:

import FacebookSDK
import RxSwift
import PinLayout
想象一下,您在文件中使用了所有这些导入。这个文件还依赖于另一个文件,它依赖于另一个库,而另一个库又使用另一个库等等

因此,要编译您的文件,Xcode必须编译您提到的每个库以及它所依赖的每个文件,因此,如果您更改其中一个“核心”文件,Xcode必须重建整个项目

Xcode构建是多线程的,但它由许多单线程树组成

因此,在每次增量构建的第一步,Xcode都要决定哪些文件必须重新编译并构建一个新文件。如果您更改了在其他文件上充当“可靠”的文件,则必须重新编译充当“依赖”的所有其他文件

因此,第一个建议是降低耦合。您的项目部分必须相互独立

Obj-C/Swift桥 这些树的问题如果使用Obj-C/Swift桥接器,Xcode必须经历比通常更多的阶段:

完美世界:

  • 构建Obj-C代码
  • 构建Swift代码
  • Obj-C/Swift桥:

  • [可重复步骤]构建Swift代码,这是编译Obj-C代码所需的
  • [可重复步骤]构建Obj-C代码,这是编译Swift代码所需的
  • 重复1和2,直到只剩下不可靠的Swift和Obj-C代码
  • 构建Obj-C代码
  • 构建Swift代码
  • 所以,如果你在第一步或第二步做了一些改变,你基本上就有麻烦了。 最好的解决方案是最小化Obj-C/Swift桥(并将其从项目中删除)

    如果您没有Obj-C/Swift桥接器,那就太棒了,您可以进入下一步:

    Swift软件包经理 是时候转到SwiftPM了(或者至少更好地配置您的CoCoapod)

    问题是,大多数带有默认Cocoapods配置的框架都会拖拽很多您不需要的东西

    要测试这一点,请创建一个只有一个依赖项的空项目,例如PinLayout,并尝试使用Cocoapods(默认配置)和SwiftPM编写此代码

    import PinLayout
    
    final class TestViewController: UIViewController {
    
    }
    
    扰流板:Cocoapods将编译此代码,因为Cocoapods将导入PinLayout(包括UIKit)的每次导入,而SwiftPM不会,因为SwiftPM以原子方式导入框架

    肮脏的黑客 还记得Xcode构建是多线程的吗


    如果你能够将你的项目分割成许多独立的部分,并将它们作为独立的框架导入到你的项目中,你就可以滥用它。它确实降低了耦合,这实际上是我们使用的第一个解决方案,但实际上并不十分有效,因为我们只能将增量构建时间减少到~4-5m,与第一种方法相比,这算不了什么。

    我建议:确保使用增量构建而不是整个模块优化来调试构建。退出并清除衍生数据。更新到Xcode 11.4,它有时编译得很快,我甚至看不到它发生。这个线程可能会回答你的问题:它非常依赖于项目,它需要分析正在发生的事情的构建日志。我在Xcode 11.2+中没有观察到这种行为,而我有非常大的项目。您是否会以某种方式提供对项目源的访问,否则所有建议都毫无意义?请检查旧版生成系统属性,如果您没有修改子模块,则应取消选中该属性祝您好运,伙计。分享您在项目中降低耦合的经验。再见!你们有什么方法可以找到给定文件的依赖项吗?为什么“不优化”而不是“速度优化”?第二个不是为构建速度而优化的?@RomuloBM不,它是为代码执行时的速度/性能而优化的