循环内部;构建可能会产生不可靠的结果:Xcode错误

129
我正在尝试在使用Xcode编译时切换到新的构建系统。然而,它出现了以下错误:
Cycle details:
→ Target 'project' : LinkStoryboards

Target 'project' has compile command with input '/Users/project/Commons/Components/ScreenshotSharing/ViewController/AppShare.storyboard'

Target 'project' : ValidateEmbeddedBinary /Users/project/Xcode/DerivedData/project-hgqvaddkhmzxfkaycbicisabeakv/Build/Products/Debug-iphoneos/project.app/PlugIns/stickers.appex

Target 'project' has process command with input '/Users/project/Resources/Info.plist'

Target 'project' has compile command with input '/Users/project/Commons/Components/ScreenshotSharing/ViewController/AppShare.storyboard'

Screenshot added

即使删除了问题文件,我在另一个xib/storyboard上仍然遇到相同的问题。如何在不回退到传统的构建系统的情况下解决这个错误?

我曾遇到类似的错误,但通过删除“派生数据”和清理项目来解决它。这对我来说非常有效! - Jayprakash Dubey
38个回答

58

实际上,你只需要注意Xcode的提示This usually can be resolved by moving the target's Headers build phase before Compile Sources,然后你就可以解决它。

当我遇到这个问题时,Xcode会提示我:

:-1: Cycle inside XXXX; building could produce unreliable results. This usually can be resolved by moving the target's Headers build phase before Compile Sources.
Cycle details:
→ Target 'XXXX': LinkStoryboards
○ Target 'XXXX: Ditto Path/XXXX-Swift.h /Path/XXXX-Swift.h
○ Target 'XXXX has compile command for Swift source files
○ That command depends on command in Target 'XXXX: script phase “Run Script

我只做了一件事,完美地解决了问题:

选择Target,然后选择Build PhaseRun Script移到Compile Sources之前。

运行,编译成功。

原理很简单,只需改变编译顺序。

image 1

Xcode 10.2 & Swift 5


4
这个方法有效,但只能使用一次,然后在下次构建命令中,问题又会出现。 - Swati
谢谢,这对我很有用。我使用了R.swift,这一步在“安装”中,但我错过了它。 - Владислав Шматок

53

我遇到了Cocoapods的问题。解决方法是清空构建文件夹,重新安装所有pods,然后重新构建应用程序。通过这种方式问题得以解决。


2
这对我也起作用了。我进行了清理和pod安装。 - Cloud9999Strife
在我的情况下,我只是执行了一个 pod install,所以只需要清理构建文件夹。这个错误只在我允许 Xcode 更新构建设置后出现。 - Stonetip
遇到了Alamofire的问题。进行了“清理构建文件夹”的操作,而没有重新安装任何cocoa pods,问题得到了解决。 - kite_n_code
你如何清理构建文件夹? - rsedlr

53

如果您在使用Xcode 10构建系统时遇到问题,请按以下步骤进行修复:

  1. 在Xcode中,转到“文件”->“项目/工作区设置”。
  2. 将构建系统更改为传统构建系统。

这将解决新版Xcode的构建问题。

如果您想要使用新的构建系统,则可以在苹果Xcode帮助页面找到故障排除帮助。


85
问题的核心是要迁移到最新的构建系统。 - Sahil Kapoor
5
那么你应该在问题中明确提到,不希望通过更改构建系统来解决。同时,我已经提到,如果你想使用新的构建系统,可以按照 Xcode 支持中心给出的步骤操作。另外,在给出反对意见时,请提供一个合理的理由。谢谢!@SahilKapoor - Akshay Sunderwani
2
谢谢您,善良的陌生人。我唯一的兴趣是让我的构建再次工作,以满足截止日期,所以您的答案正是我需要的。 - Dan Loughney
11
这并不是解决问题的恰当方法。为了这么简单的事情,构建系统不应该被改变为旧版。 - Varun Goyal
1
不要按照这些说明操作。这是错误的。名称中有一个提示:“Legacy”-实际上,它已经被弃用,并且不再得到支持。 - strangetimes

34

我通过将“复制捆绑资源”构建阶段放置在所有“复制文件”和“链接二进制文件库”构建阶段之前来解决了我的问题。


+1,但我使用了一个小变化。我不需要移动任何东西到“链接二进制文件库”之前,因为Xcode中的新默认项目不是这样的。我只是将“复制包资源”移到“复制帮助器工具”之前(它会将一些命令行工具和助手应用程序复制到macOS应用程序产品的Contents/Helpers中)。但由于这两个的顺序不应该有任何区别——它们只是在复制文件——所以这没有意义。因此,我提交了一个错误:42927301。我的修改方案:交换各种复制XXX构建阶段,直到它起作用:( - Jerry Krinock
2
和我一样,我把复制捆绑资源的步骤移到了复制文件步骤之上,然后它现在就工作了。我将重现你的错误@JerryKrinock。 - Peter N Lewis
对我来说,问题出在嵌入式框架依赖上,所以我将嵌入式框架移到了复制捆绑资源之上,这样就解决了问题。 - Elena

25

我在使用Cocoapods时遇到了问题,找到了一个临时解决方法:

  1. 安装最新版本的Cocoapods(1.5.3):sudo gem update cocoapods
  2. 删除派生数据:rm -rf ~/Library/Developer/Xcode/DerivedData/*
  3. pod install

来源在这里,我正在使用Xcode 10 beta 4。

编辑:现在已经升级到Xcode 10.0,仍然有效。


上周我在Xcode 10.1 (10B61)上又遇到了这个问题,但最终还是解决了。在执行步骤2.3.之前,请务必进行“清理构建文件夹”操作(退出Xcode也可能有帮助)。 - gabuchan
运行得非常顺利! - flagman

20

Xcode 15 上出现了同样的问题

解决方案 1

如果在 构建阶段 中有一个 运行脚本,请将其放到最下面

运行脚本在哪里?请参考这里

解决方案 2

Xcode 15 不支持 iOS 11.0 及以下版本。该平台支持的部署目标版本限制为 12.0。

在 podfile 的末尾添加以下代码块

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'No'
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
      __apply_Xcode_12_5_M1_post_install_workaround(installer)
    end
  end
end

解决方案3(适用于我):
在嵌入基础扩展的构建阶段中,勾选“仅在安装时复制”。

enter image description here

也可以在这里看看


2
你的第三个解决方案对我起作用了。我正在尝试在Flutter应用中使用共享扩展。 - undefined
2
非常感谢,我(必须)使用OneSignal并遇到了同样的问题。解决方案3对我也起作用。 - undefined
2
第一个解决方案适用于Xcode 15.0 (15A240d)。 - undefined
1
我无法感谢你足够了。问题出现在Xcode 15上,你的第一个解决方案对我起了作用。我不得不将所有带有脚本的构建阶段移到我的Embed Foundation Extensions部分下面,才能消除错误。 - undefined
1
第三个方法对我有用(Xcode 15 带来了这个方法)。 但在我的情况下,构建阶段的名称是“嵌入手表内容”,因为我的应用程序有一个手表伴侣应用程序。 - undefined
显示剩余2条评论

19

Xcode 10 的新构建系统可以检测您的构建中的依赖循环,并提供诊断以帮助您解决它们。修复这些依赖关系循环可以提高构建的可靠性,从而可以始终生成正确的产品(循环是需要删除派生数据的可能原因之一)。它还可以提高增量构建时间,因为构建中的循环会导致构建图中的某些内容在每次构建时始终过时,使得构建每次都需要不必要的重新进行。

有关解决Xcode帮助中一些常见类型的依赖循环的文档,请参阅: https://help.apple.com/xcode/mac/current/#/dev621201fb0

话虽如此,这种循环诊断看起来有点奇怪。听起来您能够通过重新排列构建阶段来解决它,但我认为诊断并没有真正解释问题所在。如果您不介意的话,非常感谢您报告一个关于改进特定情况下此诊断的错误报告。您可以在https://bugreport.apple.com上提交一个,其中包括您认为可能相关的项目的所有详细信息。能够重现问题的示例项目是理想的,但如果您无法附加该项目,则诊断和一些有关项目结构的想法仍然有所帮助。


17

我最终通过将主目标的Build Phases中的嵌入应用程序扩展脚本移动到最后一个位置来解决了这个问题。


在 Xcode 10.0 beta 4 (10L213o) 中出现了这个错误 - 这个解决方法解决了它 :-) - StackUnderflow
如何做到这一点?您能逐步解释一下吗?基本上,我在Siri kit中有一个扩展程序,在模拟器上无法运行应用程序,但在设备上可以工作。 - Sultan Ali

17

我曾遇到一个类似的问题,涉及Swift、Objective-C和CoreData的混合交互:在我的项目(用Swift编写)中,我利用了Core Data自动生成的Swift类。

但有一次,我需要一个Objective C类,其中包含公共属性(在其头部对应文件中定义),这些属性引用了核心数据实体。

#import "ProjectName-Swift.h" // this is to import the swift entities into ObjC

@interface myObjCClass : NSObject

@property (nonatomic) MyCoreDataClass*myEntity;

@end

当我改变了CoreData模型后,XCode试图重建类,结果我被指示的循环构建错误所困扰。

一开始我感到绝望,因为我的项目中没有编译头阶段可以更改顺序,但我发现解决方案非常简单:

myObjCClass.h中,我删除了共享的Swift头文件导入语句,并用@class指令替换它:

@class MyCoreDataClass; // tell the compiler I will import the class definition somewhere else

// the rest stays the same
@interface myObjCClass : NSObject

@property (nonatomic) MyCoreDataClass*myEntity;

@end

我将#import "ProjectName-Swift.h"语句移动到myObjCClass.m类定义文件中。

#import "myObjCClass.h"
#import "ProjectName-Swift.h"

@implementation myObjCClass

@end

它没有任何担忧。


哇,非常感谢。我整晚都在苦苦挣扎,但是当我彻底实施了这个建议后,问题就解决了! - Erik van der Neut

12
这是关于使用Xcode15 beta 8的问题,对于那些使用Firebase Crashlytics的人来说。解决方法是将Crashlytics运行脚本阶段(或者可能是其他脚本阶段)移动到“Build Phases”选项卡的底部。
编辑:在Xcode15 RC上问题仍然存在。

1
这个方法居然奏效了!你是怎么找出这是原因的? - undefined
1
我在苹果论坛上找到了它,我想。 - undefined
1
这个对我解决了。目前使用的是Xcode 15.0.1。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接