里面循环;构建可能会产生不可靠的结果:Xcode 错误
Cycle inside ; building could produce unreliable results: Xcode Error
我试图在使用 Xcode 10 编译时转移到新的构建系统。但是,它给出了以下错误:
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'
即使在删除问题文件后,另一个 xib/storyboard 也是如此。如何在不恢复到旧构建系统的情况下解决此错误?
我终于能够通过将主目标 Build Phases
中的 Embed App Extensions
脚本移动到最后一个位置来解决这个问题。
Xcode 10 的新构建系统可检测构建中的依赖循环并提供诊断以帮助您解决它们。修复这些依赖循环可以提高构建的可靠性,从而始终如一地生产正确的产品(循环是需要删除派生数据的可能原因)。它还可以缩短增量构建时间,因为构建周期会导致构建图中的某些内容在每次构建时总是过时,从而使构建在每次构建时都不必要地重新进行。
Xcode 帮助中有关于解决一些常见类型的循环依赖的文档:https://help.apple.com/xcode/mac/current/#/dev621201fb0
也就是说,这个周期诊断看起来有点奇怪。听起来您可以通过重新安排构建阶段来解决它,但我认为诊断并不能真正解释问题。如果您不介意,我们将非常感谢关于改进此特定案例的诊断的错误报告。您可以在 https://bugreport.apple.com 提交一份。请包括您认为可能相关的有关您的项目的所有详细信息;重现问题的示例项目是理想的,但如果您不能附加它,项目结构的诊断和一些想法仍然有帮助。
我在使用 Cocoa 时遇到了这个问题pods。解决方案是清理构建文件夹重新安装所有 pods,然后重建应用程序。问题就这样自行解决了。
我通过将 'Copy Bundle Resources' 构建阶段移到所有 'Copy Files' 和 'Link Binary with Libraries' 构建阶段
之前解决了我的问题
对于 Xcode 10 构建系统有问题的任何人,请按照以下步骤修复它:
- In Xcode, go to File->Project/Workspace settings.
- Change the build system to Legacy Build system.
它将解决新 Xcode 的构建问题。
如果您想使用新的构建系统,那么您可以找到故障排除帮助 from this apple Xcode help page。
Version 10.0 beta 3 (10L201y)
上有同样的问题,我想要新构建系统。
问题是被禁用了Enable Modules (C and Objective-C)
在Build Settings -> Apple Clang - Language - Modules
启用后(设置为 YES)消除了错误。
在目标的Scheme
中,找到标签Build
,确保没有勾选Find Implicit Dependencies
。这些步骤可能有效。
我在使用 Cocoapods 时遇到了这个问题并找到了一个临时解决方法:
- 安装最新版本的 cocoapods (1.5.3):
sudo gem update cocoapods
- 删除您派生的数据:
rm -rf ~/Library/Developer/Xcode/DerivedData/*
pod install
来源 here 我正在使用 Xcode 10 beta 4。
编辑:现在 Xcode 10.0 并且仍然相关。
我遇到了同样的问题:下面是错误
Cycle in dependencies between targets 'Pods-MyAppName' and 'RxCocoa';
building could produce unreliable results. This usually can be
resolved by moving the target's Headers build phase before Compile
Sources. Cycle path: Pods-MyAppName → RxCocoa → Pods-MyAppName
我通过以下步骤解决了这个问题:
1).转到 Pods-MyAppName 项目
中的目标 RxCocoa
2) 进入构建阶段
3) 拖动 Headers Phase 并将其移动到 Compile Sources 构建阶段上方。
这解决了我的问题。
希望对您有所帮助!
我试图在 Xcode 10 上存档我的项目时遇到了类似的问题。
这是详细信息:
→ Target 'mytarget': CodeSign /path/to/mytarget.app
○ Target 'mytarget': SetGroup staff /path/to/mytarget.app
○ Target 'mytarget': SetMode u+w,go-w,a+rX /path/to/mytarget.app
○ Target 'mytarget': SetGroup staff /path/to/mytarget.app
通过在 mytarget -> Build Settings -> Deployment -> Install Owner
中设置 $(USER)
修复了它
您似乎需要更改 Pods 目标中构建阶段的顺序。对我来说,将 Headers 移到其余部分之上是可行的。您可以在 Podfile 中自动执行此操作:
require 'xcodeproj'
post_install do |installer|
installer.pods_project.targets.each do |target|
headers_phase = target.build_phases.find { |p| p.kind_of?(Xcodeproj::Project::Object::PBXHeadersBuildPhase) }
if headers_phase
puts "#{target.name}: Moving Headers build phase to top"
target.build_phases.insert(0, target.build_phases.delete_at(target.build_phases.index(headers_phase)))
end
end
end
我在 Swift、Objective-C 和 CoreData 之间的混合交互中遇到了类似的问题:在我的项目中(写在 Swift ) 我也使用了 Core Data 自动生成的 Swift classes。
但有一次我需要一个 Objective C class 和 public 属性(在其 header 对应项中定义)来引用核心数据实体。
#import "ProjectName-Swift.h" // this is to import the swift entities into ObjC
@interface myObjCClass : NSObject
@property (nonatomic) MyCoreDataClass*myEntity;
@end
我一更改 CoreData 模型,XCode 就试图重建 classes,但我被指示的循环构建错误挂住了。
在最初的绝望时刻之后,因为我的项目中没有任何编译 header 阶段可以更改顺序,我发现解决方案非常简单:
在 myObjCClass.h
中,我删除了共享 Swift header 导入语句并使用 @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
class 定义文件中。
#import "myObjCClass.h"
#import "ProjectName-Swift.h"
@implementation myObjCClass
@end
它建立了无后顾之忧。
我的解决方案是清理构建文件夹然后重新构建。
Core_Data
我遇到了同样的问题和错误,但是当我为我的实体“创建 NSManagedObject 子类”时,我遇到了这个错误。因此,如果您认为您的错误与我关于 Core Data 的错误相同,那么可能对您(和帮助我)有帮助的是:
- 点击“xcdatamodel”文件中的实体
- 转到右侧栏,单击“数据模型检查器”
- 将“模块”更改为“当前产品模块”
- 最后,将“Codegen”更改为“Manual/None”
- 清理并构建
我想是因为在其他情况下Xcode会自动创建一个文件,当我们创建另一个文件时会导致冲突。
您也许可以在这里解决这个问题:
文件 -> 工作区设置 -> 构建系统:新建构建系统
我已经尝试过此页面中的内容,但唯一对我有帮助的是我制作了目标的副本并更新了副本的名称(删除了副本后缀),并删除了旧的,并且之后安装了 pod。
我的问题与 swift 桥接头文件和 objective c 文件之间的循环依赖有关。
在我的 objective c 头文件中,我有一个 #import "...-swift.h"
文件,然后在我的几个 swift 文件中,我将这些文件包含在上述导入中,从而导致循环依赖.
这是引导我找到解决方案的 Whosebug:
Objective C, Swift Interoperability issue due to circular dependency
How to prevent circular reference when Swift bridging header imports a file that imports Hopscotch-Swift.h itself
编辑:
我最终将上述文件转换为 swift,这解决了我的问题。
以下两个选项对我有用:文件->Project/Workspace 设置。
1、在文件->项目设置
中将构建系统更改为"Legacy Build system"
2、编辑方案和 Select "Parallelize Build" 选项在构建部分下。
Xcode 10.2.1/单元测试目标。我的单元测试目标独立于主机目标以缩短构建时间。通过取消选中 Scheme
- Build
选项中的 Find Implicit Dependencies
来解决它,因为我在 Build Settings
- Compile Sources
.
中指定了所有依赖项
其实你只需要注意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”
我只做了一件事,完美解决了问题:
Select Target
然后 select Build Phase
将 Run Script
移动到 Compile Sources
.
的前面
运行,编译成功
原理很简单,改一下编译顺序就可以了
Xcode 10.2 &
Swift5
我在将 Xcode 更新到版本 11.4 后遇到了这个问题。降级到 11.2.1 修复了它。
Xcode: 11.3.1
目标:XCUITest 目标
运行 命令清理构建文件夹:rm -rf ~/Library/Developer/Xcode/DerivedData/*
更改工作区设置:Select 旧版构建系统
在 LHS 的项目窗格中,对于您的构建产品,不要 select 它们出现在 RHS 窗格的 Target 成员资格列表中。
我找到的最好的临时解决方法(直到您解决了根本问题)是对源代码进行简单的更改(即使是像添加新行一样微不足道的更改)然后重试。我发现即使是对空白进行更改也足以让它重新构建。然而,这绝对是暂时的,因为它可能会在几次尝试后再次发生。
这比清理构建文件夹(我发现它也是临时的)要好,因为更改空白并重建比清理构建文件夹并重建(尤其是在较大的项目上)要快得多。
这个问题也有一段时间了。在 podfile 的末尾添加了以下块(这也将消除一些警告):
post_install do |installer|
installer.pods_project.targets.each do |target|
target.deployment_target = ios_version
target.build_configurations.each do |config|
config.build_settings['IOS_DEPLOYMENT_TARGET'] = 'iOS ' + ios_version
end
end
end
我也将 use_frameworks!
移到了 Podfile
的根目录。
我对 Cocoa 也有同样的问题pods。
首先,移除pods:
rm -rf ios/Pods
然后再次安装 pods:
cd ios && pod install && cd ..
然后 运行 你的应用程序,现在应该可以运行了。
就我而言,
删除所有 pods 并重新安装解决了错误
Remove Pods directory in ios folder
pod install
仅限世博会
expo prebuild --clean
cd ios
pod install
yarn ios
我试图在使用 Xcode 10 编译时转移到新的构建系统。但是,它给出了以下错误:
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'
即使在删除问题文件后,另一个 xib/storyboard 也是如此。如何在不恢复到旧构建系统的情况下解决此错误?
我终于能够通过将主目标 Build Phases
中的 Embed App Extensions
脚本移动到最后一个位置来解决这个问题。
Xcode 10 的新构建系统可检测构建中的依赖循环并提供诊断以帮助您解决它们。修复这些依赖循环可以提高构建的可靠性,从而始终如一地生产正确的产品(循环是需要删除派生数据的可能原因)。它还可以缩短增量构建时间,因为构建周期会导致构建图中的某些内容在每次构建时总是过时,从而使构建在每次构建时都不必要地重新进行。
Xcode 帮助中有关于解决一些常见类型的循环依赖的文档:https://help.apple.com/xcode/mac/current/#/dev621201fb0
也就是说,这个周期诊断看起来有点奇怪。听起来您可以通过重新安排构建阶段来解决它,但我认为诊断并不能真正解释问题。如果您不介意,我们将非常感谢关于改进此特定案例的诊断的错误报告。您可以在 https://bugreport.apple.com 提交一份。请包括您认为可能相关的有关您的项目的所有详细信息;重现问题的示例项目是理想的,但如果您不能附加它,项目结构的诊断和一些想法仍然有帮助。
我在使用 Cocoa 时遇到了这个问题pods。解决方案是清理构建文件夹重新安装所有 pods,然后重建应用程序。问题就这样自行解决了。
我通过将 'Copy Bundle Resources' 构建阶段移到所有 'Copy Files' 和 'Link Binary with Libraries' 构建阶段
之前解决了我的问题对于 Xcode 10 构建系统有问题的任何人,请按照以下步骤修复它:
- In Xcode, go to File->Project/Workspace settings.
- Change the build system to Legacy Build system.
它将解决新 Xcode 的构建问题。
如果您想使用新的构建系统,那么您可以找到故障排除帮助 from this apple Xcode help page。
Version 10.0 beta 3 (10L201y)
上有同样的问题,我想要新构建系统。
问题是被禁用了Enable Modules (C and Objective-C)
在Build Settings -> Apple Clang - Language - Modules
启用后(设置为 YES)消除了错误。
在目标的Scheme
中,找到标签Build
,确保没有勾选Find Implicit Dependencies
。这些步骤可能有效。
我在使用 Cocoapods 时遇到了这个问题并找到了一个临时解决方法:
- 安装最新版本的 cocoapods (1.5.3):
sudo gem update cocoapods
- 删除您派生的数据:
rm -rf ~/Library/Developer/Xcode/DerivedData/*
pod install
来源 here 我正在使用 Xcode 10 beta 4。
编辑:现在 Xcode 10.0 并且仍然相关。
我遇到了同样的问题:下面是错误
Cycle in dependencies between targets 'Pods-MyAppName' and 'RxCocoa'; building could produce unreliable results. This usually can be resolved by moving the target's Headers build phase before Compile Sources. Cycle path: Pods-MyAppName → RxCocoa → Pods-MyAppName
我通过以下步骤解决了这个问题:
1).转到 Pods-MyAppName 项目
中的目标 RxCocoa2) 进入构建阶段
3) 拖动 Headers Phase 并将其移动到 Compile Sources 构建阶段上方。
这解决了我的问题。 希望对您有所帮助!
我试图在 Xcode 10 上存档我的项目时遇到了类似的问题。 这是详细信息:
→ Target 'mytarget': CodeSign /path/to/mytarget.app
○ Target 'mytarget': SetGroup staff /path/to/mytarget.app
○ Target 'mytarget': SetMode u+w,go-w,a+rX /path/to/mytarget.app
○ Target 'mytarget': SetGroup staff /path/to/mytarget.app
通过在 mytarget -> Build Settings -> Deployment -> Install Owner
$(USER)
修复了它
您似乎需要更改 Pods 目标中构建阶段的顺序。对我来说,将 Headers 移到其余部分之上是可行的。您可以在 Podfile 中自动执行此操作:
require 'xcodeproj'
post_install do |installer|
installer.pods_project.targets.each do |target|
headers_phase = target.build_phases.find { |p| p.kind_of?(Xcodeproj::Project::Object::PBXHeadersBuildPhase) }
if headers_phase
puts "#{target.name}: Moving Headers build phase to top"
target.build_phases.insert(0, target.build_phases.delete_at(target.build_phases.index(headers_phase)))
end
end
end
我在 Swift、Objective-C 和 CoreData 之间的混合交互中遇到了类似的问题:在我的项目中(写在 Swift ) 我也使用了 Core Data 自动生成的 Swift classes。
但有一次我需要一个 Objective C class 和 public 属性(在其 header 对应项中定义)来引用核心数据实体。
#import "ProjectName-Swift.h" // this is to import the swift entities into ObjC
@interface myObjCClass : NSObject
@property (nonatomic) MyCoreDataClass*myEntity;
@end
我一更改 CoreData 模型,XCode 就试图重建 classes,但我被指示的循环构建错误挂住了。
在最初的绝望时刻之后,因为我的项目中没有任何编译 header 阶段可以更改顺序,我发现解决方案非常简单:
在 myObjCClass.h
中,我删除了共享 Swift header 导入语句并使用 @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
class 定义文件中。
#import "myObjCClass.h"
#import "ProjectName-Swift.h"
@implementation myObjCClass
@end
它建立了无后顾之忧。
我的解决方案是清理构建文件夹然后重新构建。
Core_Data
我遇到了同样的问题和错误,但是当我为我的实体“创建 NSManagedObject 子类”时,我遇到了这个错误。因此,如果您认为您的错误与我关于 Core Data 的错误相同,那么可能对您(和帮助我)有帮助的是:
- 点击“xcdatamodel”文件中的实体
- 转到右侧栏,单击“数据模型检查器”
- 将“模块”更改为“当前产品模块”
- 最后,将“Codegen”更改为“Manual/None”
- 清理并构建
我想是因为在其他情况下Xcode会自动创建一个文件,当我们创建另一个文件时会导致冲突。
您也许可以在这里解决这个问题:
文件 -> 工作区设置 -> 构建系统:新建构建系统
我已经尝试过此页面中的内容,但唯一对我有帮助的是我制作了目标的副本并更新了副本的名称(删除了副本后缀),并删除了旧的,并且之后安装了 pod。
我的问题与 swift 桥接头文件和 objective c 文件之间的循环依赖有关。
在我的 objective c 头文件中,我有一个 #import "...-swift.h"
文件,然后在我的几个 swift 文件中,我将这些文件包含在上述导入中,从而导致循环依赖.
这是引导我找到解决方案的 Whosebug:
Objective C, Swift Interoperability issue due to circular dependency
How to prevent circular reference when Swift bridging header imports a file that imports Hopscotch-Swift.h itself
编辑:
我最终将上述文件转换为 swift,这解决了我的问题。
以下两个选项对我有用:文件->Project/Workspace 设置。
1、在文件->项目设置
中将构建系统更改为"Legacy Build system"2、编辑方案和 Select "Parallelize Build" 选项在构建部分下。
Xcode 10.2.1/单元测试目标。我的单元测试目标独立于主机目标以缩短构建时间。通过取消选中 Scheme
- Build
选项中的 Find Implicit Dependencies
来解决它,因为我在 Build Settings
- Compile Sources
.
其实你只需要注意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”
我只做了一件事,完美解决了问题:
Select Target
然后 select Build Phase
将 Run Script
移动到 Compile Sources
.
运行,编译成功
原理很简单,改一下编译顺序就可以了
Xcode 10.2 & Swift5
我在将 Xcode 更新到版本 11.4 后遇到了这个问题。降级到 11.2.1 修复了它。
Xcode: 11.3.1 目标:XCUITest 目标
运行 命令清理构建文件夹:rm -rf ~/Library/Developer/Xcode/DerivedData/*
更改工作区设置:Select 旧版构建系统
在 LHS 的项目窗格中,对于您的构建产品,不要 select 它们出现在 RHS 窗格的 Target 成员资格列表中。
我找到的最好的临时解决方法(直到您解决了根本问题)是对源代码进行简单的更改(即使是像添加新行一样微不足道的更改)然后重试。我发现即使是对空白进行更改也足以让它重新构建。然而,这绝对是暂时的,因为它可能会在几次尝试后再次发生。
这比清理构建文件夹(我发现它也是临时的)要好,因为更改空白并重建比清理构建文件夹并重建(尤其是在较大的项目上)要快得多。
这个问题也有一段时间了。在 podfile 的末尾添加了以下块(这也将消除一些警告):
post_install do |installer|
installer.pods_project.targets.each do |target|
target.deployment_target = ios_version
target.build_configurations.each do |config|
config.build_settings['IOS_DEPLOYMENT_TARGET'] = 'iOS ' + ios_version
end
end
end
我也将 use_frameworks!
移到了 Podfile
的根目录。
我对 Cocoa 也有同样的问题pods。
首先,移除pods:
rm -rf ios/Pods
然后再次安装 pods:
cd ios && pod install && cd ..
然后 运行 你的应用程序,现在应该可以运行了。
就我而言,
删除所有 pods 并重新安装解决了错误
Remove Pods directory in ios folder
pod install
仅限世博会
expo prebuild --clean
cd ios
pod install
yarn ios