Xcode项目在macOS上有实时问题,但在iOS上没有

1cklez4t  于 2023-03-04  发布在  Mac
关注(0)|答案(1)|浏览(153)

我们有一个同时支持iOS和macOS的Xcode项目。该项目针对每个平台有不同的模式和两个独立的应用程序目标,但大多数代码都在两个平台共享的框架目标中。两个模式都可以无错误地构建,因此构建通常不是问题,并按预期工作。
然而,在编辑代码时,只有macOS模式会出现实时问题(编辑时出现编译器错误和警告)。当我们切换到iOS模式时,编辑代码时不会显示任何错误。如果我们触发了完整的iOS构建,但出现了构建错误,错误会短暂地显示在源代码编辑器中,但几秒钟后就会消失,因此只有构建日志会告诉我们哪里出错了。
作为一种解决方案,我们发现禁用实时问题(Preferences > General > Show live issues)至少可以确保上次手动触发构建的构建错误永久显示在编辑器中。虽然这已经是一个巨大的改进,但这些错误在我们触发另一个构建之前不会更新,这仍然有点烦人和耗时。当我们使用macOS方案时,一切都像一个魅力。
这个问题同样出现在Xcode 13. x和Xcode 14. x中,无论确切的版本是什么。有人知道是什么导致了这个问题,以及如何修复它吗?

csga3l58

csga3l581#

这可能发生的原因有很多,通常发生的是后台脱绒过程以这样的方式失败,即根本不产生问题,并且因为后台脱绒过程报告的问题覆盖了最后一个构建报告的问题,所以最后一个构建的问题短暂地出现,然后再次消失。
我个人认为这是Xcode中一个相当愚蠢的错误,因为当去毛过程失败时,Xcode不应该用去毛过程中的空问题列表替换上一次构建的问题,毕竟它知道去毛失败了,这是问题列表为空的真正原因,而不是因为去毛过程没有发现任何问题。
要解决这个问题,你需要找出后台掉毛失败的原因,因此你打开一个终端,启动Xcode,如下所示:

SOURCEKIT_LOGGING=3 /<path-to-xcode>/Xcode.app/Contents/MacOS/Xcode 2>xcode.txt

然后编辑任意一个文件,让linter在后台运行,然后再次退出Xcode,打开文件xcode.txt,搜索你刚刚编辑的源文件的名称,它可能会出现多次,但你要找的条目如下:

[date] [time] Xcode[...] SourceKit-client: [...] {
  key.compilerargs: [
    "-x",
    "objective-c",
    "-ivfsoverlay",
:
   ]

这些是编译器用来填充文件的参数。要将参数转换为shell格式,只需复制[]之间的所有内容(这是一个JSON数组),然后执行正则表达式搜索并替换,\n$,并将其替换为nothing(空字符串)。这将为您提供一个包含所有参数的单行。
现在你可以用这些参数在Terminal中调用编译器,并查看问题所在。根据文件的类型,编译器可以是clang(c,objc)、clang++(c++,objc++)或swiftc(swift)。你应该会得到一个错误,至少可以提示你问题所在。
通常找不到标头或模块,这在Xcode中构建项目时也会是一个问题,但在构建过程中,有时该问题会得到修复,因为组件是按特定顺序构建的,可以在构建过程中的构建目标目录中找到,或者构建配置的一部分被动态覆盖。当linter运行时,这些都不会发生。Xcode很大程度上依赖于所有项目设置的正确性,以及所有隐式依赖项的可检测性,或者在生成linting参数时将其配置为显式依赖项。此外,构建脚本阶段会使用某种巫毒魔法使构建成为可能,这可能是一个大问题,因为这些阶段也不会运行。
一旦你发现了linter错误,但不知道如何修复它,只需在SO上发布一个新的问题并寻求帮助。现在你有了确切的错误信息,给予你建议会容易得多,而不仅仅是在黑暗中猜测。

相关问题