Xcode 10错误:产生多个命令

问题描述 投票:450回答:55
error: Multiple commands produce '/Users/uesr/Library/Developer/Xcode/DerivedData/OptimalLive-fxatvygbofczeyhjsawtebkimvwx/Build/Products/Debug-iphoneos/OptimalLive.app/Info.plist':
1) Target 'OptimalLive' has copy command from '/Users/uesr/Desktop/workSpace/SEALIVE/SeaLive1.1/OptimalLive/Info.plist' to '/Users/uesr/Library/Developer/Xcode/DerivedData/OptimalLive-fxatvygbofczeyhjsawtebkimvwx/Build/Products/Debug-iphoneos/OptimalLive.app/Info.plist'
2) Target 'OptimalLive' has copy command from '/Users/uesr/Desktop/workSpace/SEALIVE/SeaLive1.1/OptimalLive/Server/Masonry/Info.plist' to '/Users/uesr/Library/Developer/Xcode/DerivedData/OptimalLive-fxatvygbofczeyhjsawtebkimvwx/Build/Products/Debug-iphoneos/OptimalLive.app/Info.plist'
3) Target 'OptimalLive' has process command with input '/Users/uesr/Desktop/workSpace/SEALIVE/SeaLive1.1/OptimalLive/Info.plist'

在Xcode 9中运行代码有效,但在Xcode 10中导致错误。

info.plist xcode10
55个回答
784
投票

由于App中存在多个Plist或其他文件,可能会出现此问题

解决方案 - >打开目标 - >构建阶段>复制捆绑资源并从那里删除info.plist

enter image description here

注意:如果您也开发了手表应用程序,那么您也必须从手表和手表扩展中移除钳子。


15
投票

在我的情况下,PDFGenerator正在生成一个info.plist文件,我刚删除它。

enter image description here


13
投票

我有同样的问题,我在主应用程序中有一个更多的帮助应用程序并在资源中复制它。在我的情况下解决了: -

1)目标 - > 2)构建阶段2)复制文件(n项)3)删除复制文件。

Helper应用程序自动复制到Xcode 10.0中。

enter image description here


13
投票

这里提出的解决方案都不适用于我。这特别是由于CocoaPods。我之前使用的是Cocoapods 1.3.1。简单地升级到1.5.3并没有立即解决问题。

我遵循的步骤是:

  1. 删除Podfile.lock
  2. 删除Pods目录
  3. 删除派生数据和清理
  4. 退出Xcode
  5. 将CocoaPods更新为1.5.3
  6. 运行pod install
  7. 打开工作区和构建

10
投票

尝试所有这个选项,这3个选项中的任何一个都可以为你工作,当然

Option 1: Remove all files from

目标>>构建阶段>>编译源

目标>>构建阶段>>复制捆绑资源

Option 2: Change the build system

Xcode-> File-> Project Settings-> Build System - > Legacy Build System

Option 3: remove and update existing pod

pod cache clean PromisesObjC pod缓存清理PromisesSwift cd [your_project_dir] rm -rf Pods / rm Podfile.lock pod更新

I hope this will help you, Happy coding :-)

10
投票

如果错误消息引用Core Data文件,请阅读此答案

概要:您可能同时拥有自动生成和手动生成的Core Data托管对象类文件。

如果错误的第一行引用Foo + CoreDataProperties.o或Foo + CoreDataClass.o文件,则此答案适用。例:

error: Multiple commands produce '/Users/me/Library/Developer/Xcode/DerivedData/MyApp-uebslaqdwgldkjemijpdqmizgyzc/Build/Intermediates.noindex/ MyApp /Debug-iphonesimulator/ MyApp.build/Objects-normal/x86_64/Foo+CoreDataProperties.o':

1) Target ' MyApp ' (project ' MyApp ') has compile command for Swift source files

2) Target ' MyApp ' (project ' MyApp ') has compile command for Swift source files

通过扩展Build Transcript的Compile Swift Source Files部分可以看到根本原因。例如:

<unknown>:0: error: filename "Address+CoreDataClass.swift" used twice: '/Users/myUserName/Projects/Jnky/Foo+CoreDataProperties' and '/Users/jk/myUserName/Developer/Xcode/DerivedData/MyApp-uebslaqdwgldkjemijpdqmizgyzc/Build/Intermediates.noindex/MyApp.build/Debug/MyApp.build/DerivedSources/CoreDataGenerated/Jnky/Foo+CoreDataProperties.swift'

提到的第一个文件是项目目录中的源文件,有人通过在Project Navigator中选择数据模型并单击菜单Editor> Create Managed Object Subclass来生成。此功能已在Xcode 7中添加。

第二个文件是一个同名的文件,但它埋藏在Xcode的DerivedData中。如果数据模型(.xcdatamodeld)文件包含在目标的编译源构建阶段,则每次构建时Xcode都会自动生成此文件。此功能已添加到Xcode 9中。根据Codegen弹出窗口的设置,为每个实体/类生成零个,一个或两个文件。当您在编辑数据模型时选择实体时,该弹出窗口位于数据模型检查器中...

screenshot of Data Model Inspector

设置是:

  • 手动/无无文件生成
  • 类别/扩展生成一个文件,Foo + CoreDataProperties.m或.swift,包含Objective-C类别或Swift扩展。
  • 类定义生成相同的类别/扩展文件,此外还生成包含类声明和定义的Foo + CoreDataClass.m或.swift。

因此,当一个习惯于旧Xcode的开发人员(比如我)在较新的Xcode中开始一个项目时,你会发现问题就出现了。我们认为我们需要使用Create Managed Object Subclass菜单项来创建我们可以在Project Navigator中看到的文件,同时没有意识到我们在Codegen弹出窗口中的设置导致Xcode创建重复文件,Apple “聪明地”没有在Project Navigator中显示,因为他们不相信开发人员阅读并注意标题中的注释//这个文件是自动生成的,不应该被编辑。

Solution 1 - Use the Older Way

您只需一个设置即可为数据模型禁用所有自动Codegen:

  • 打开问题Target的Build Phases(在Project Navigator中,选择项目,然后在出现的TARGETS列表中,选择问题目标,然后选择Build Phases)。
  • 展开Compile Sources条目并找到问题数据模型(.xcdatamodeld文件)。
  • 从编译列表中删除它
  • 确保数据模型包含在“复制包资源”列表中。

Solution 2 - Core Data Magic For Beginners

在这里,你全力以赴。

  • 将数据模型保留为Compile Sources中的数据模型。
  • 在数据模型中的每个Entity Inspector中,将Codegen设置为Class Definition。
  • 在Project Navigator中,删除并删除任何Foo + CoreDataClass文件,并将任何Foo + CoreDataProperties.m或.swift文件重命名为Foo + MyProperties。
  • 在每个Foo + MyProperties.m或.swift文件中,如果有Xcode生成的属性,请删除这些属性,因为它们将位于Codegen创建的隐藏文件中。

使用此解决方案,您的类定义将自动从每个构建的数据模型生成。你甚至看不到它们。它是Core Data Magic,对于初学者来说非常简单。

Solution 3 - For Most Real-World Apps

但是如果你真的想要添加非托管属性,解决方案2并不好。 (Objective-C不允许在类别中添加属性,Swift不允许在扩展中添加存储的属性。)因此,在大多数真实世界的应用程序中,您可能希望在解决方案1和2之间中途...

  • 将数据模型保留在Compile Sources列表中
  • 在数据模型中的每个Entity Inspector中,将Codegen设置为Category / Extension。
  • 在Project Navigator中,删除并删除任何Foo + CoreDataClass.m或.swift文件,并且为了减少将来的混淆,将任何Foo + CoreDataProperties.m或.swift文件重命名为Foo.m或.swift。
  • 确保每个Foo.m或.swift文件都包含类定义,您可以向其添加自己的非托管属性。

(致谢正电子的回答。我的答案解释了为什么正电子的答案(我的解决方案1)有效,并添加了解决方案2和解决方案3.)


9
投票

在开始之前请注意我的项目使用Carthage作为依赖管理器。

这里现有的答案都没有解决我的问题。为我解决问题的是以下内容。

首先,我注意到构建错误特别指出了一个框架。接下来,我为该框架过滤了App Target> Build Phases。我注意到该框架存在于“Link Binary With Libraries”和“Embed Frameworks”中。注意到“嵌入框架”下列出的框架都不是迦太基管理的框架,我从“嵌入框架”中删除了有问题的框架。然后,我重新构建了我的项目,一切正常,包括相关框架启用的功能。


9
投票

脚步:

  1. 转到Xcode文件
  2. 单击“工作台设置”
  3. 构建系统选择为旧版构建系统

7
投票

我有一堆Multiple commands produce警告 - 不限于一个目标中的info.plist重复。包括本地化资源和字符串文件,标题等。

解决方案:删除目标成员中的所有重复项。


7
投票

所以我遇到的问题是我不小心将Info.plist包含在项目设置中 - > Build Phases - > Copy Bundle Resources for my target。


6
投票

我使用Carthage和Xcode 10。

我的解决方案是 - >项目 - >目标 - >常规 - >

从“嵌入式二进制文件”中删除添加了Carthage的框架

通常你必须在Build Phases中添加一个脚本来剥离app store的架构。

在Xcode 10中,脚本似乎总是被调用。因此,它将框架复制到正确的位置,您不必将它们添加到“常规”选项卡。

注意:如果没有设置 - >在构建设置 - >搜索路径 - >框架搜索路径 - >设置框架的路径你添加了Carthage ....例如。 “$(PROJECT_DIR)/迦太基/编译/ iOS版”


433
投票

我找到了这个构建错误的解决方案,对于其他任何与Xcode 10构建系统有相同问题的人,请按照以下步骤进行修复:

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

enter image description here它将解决新Xcode 10的构建问题。

如果您想使用新的构建系统,那么您可以找到故障排除帮助from this apple Xcode help page

希望这可以帮助!


5
投票

当我在两个不同的目标中有一个同名文件时,我遇到了这个问题。出于某种原因,我有两个目标的一部分文件。所以基本上我有两个文件。这两个文件都属于一个目标。

有意义的是,目标每个目标只能有一个文件名,因此只需取消选中与主目标无关的文件的目标成员框就可以解决问题。


5
投票

进入项目构建阶段并从编译源中删除info.plist。它将删除该问题,项目将再次处于活动状态。

enter image description here


4
投票

有类似的问题,但与.swiftdoc文件。

我在项目中有扩展和单元测试目标。他们将相同的“产品模块名称”(Build Settings中的PRODUCT_MODULE_NAME)作为应用程序。在使名字独特的问题消失后。


4
投票

转移到Xcode 10,错误就像

error: Multiple commands produce '/Users/uesr/Library/Developer/Xcode/DerivedData/OptimalLive-fxatvygbofczeyhjsawtebkimvwx/Build/Products/Debug-iphoneos/OptimalLive.app/Info.plist':

可以解决如下:

Xcode->File->Workspace/Project Settings-> Build System -> Legacy Build System


4
投票

这是另一个有效的解决方案:(如果你使用的是Pods)

  • 从侧边栏中选择“Pods”作为屏幕截图中的高亮显示。
  • 单击Build Phase。展开“标题”部分。 Public,Private,Project有3个选项
  • 展开Public并检查是否存在重复文件。去掉它。 DONE!

enter image description here


4
投票

我的一个CocoaPods被篡改并导致了这个问题。一个pods更新了,它运行正常。

我相信它可能是LivePerson SDK


4
投票

我的问题是Xcode 10在Mojave中运行,并且在尝试运行我在更新到XCode 10之前编写的单元测试时。

就我而言,我在运行TestTarget目标时遇到了这个问题。要解决,我不得不:

  • 删除一个目标依赖项(在TestTarget > build phases > Target Dependencies中)

因为我除了我的TestTarget之外还有另外两个目标,并且两者都运行相同的脚本并在某一点创建/复制文件。

这与Xcode 10 here的Build System发行说明中提到的内容相冲突:

构建中的任何单个文件由多个构建命令生成是错误的。例如,如果两个目标都从shell脚本阶段声明相同的输出文件,则将输出文件的声明分解为单个目标。

从Xcode 10.1更新到10.2之后的新UPDATE

在我更新到Xcode 10.2之后,类似的问题再次出现了。我有多个目标项目:Target1Target2,我通过以下方式解决了这个问题:

  • 导航到Edit Scheme > Build
  • 删除其中一个目标:取消选中Target1Test的复选框,因为我知道Target2导入了Target1

另外要注意的是,Target2的复选框将在Test下保持检查状态


3
投票

搜索和删除从多个命令生成的重复文件。

在这里,应删除额外的Info.plist文件(在我的情况下,它是Contents.json

error: Multiple commands produce '/Users/uesr/Library/Developer/Xcode/DerivedData/OptimalLive-fxatvygbofczeyhjsawtebkimvwx/Build/Products/Debug-iphoneos/OptimalLive.app/Info.plist'

3
投票

这基本上意味着你有多个名为Info.plist的文件;通常它很好,但不小心您的文件被设置为相同的目标成员资格。因此,修复方法是:单击每个文件并在右侧检查其目标成员资格,确保它们不重叠。


3
投票

选择您的方案(左上角) - >编辑方案... - >构建(左侧选项卡) - >取消选中“查找隐式依赖关系”

enter image description here

之后,您可能需要修复目标未明确导入的任何依赖项。


155
投票

转到Xcode - >文件 - >工作区设置。你会发现一个像弹出窗口一样。

enter image description here

从Build System标签中选择“Legacy Build System”。按“完成”按

注意: - 确保使用“cmd + shift + alt + k”和“派生数据”清除项目

建立你的项目它将工作魅力:)


2
投票

我和plist有同样的问题。事实证明我有两个副本,一个是空的,一个在我的本地化资源文件夹中。删除其中一个(空的)解决了这个问题。

如果检查错误,则行1)和2)具有不同的路径。您可能在复制阶段将此文件定义了两次。

检查目标属性,构建阶段,复制捆绑资源,并查找重复的info.plist。找出哪条路径不正确并将其删除。 (你可能也想从文件系统中删除它。)


98
投票

试试这个。 Xcode-> File-> Project Settings-> Build System - > Legacy Build System。


57
投票

如果你从Ditto命令创建多个同名实例(不是'copy files' build phase),你可能需要更改Product Module Name

  1. 点击您的目标Xcode正在抱怨
  2. 点击Build Settings
  3. 搜索Product Module Name
  4. 将名称更改为唯一的名称

我们的应用程序中有一个监视目标和一些通知目标,所以我只是将Extension这样的东西放在模块名称的末尾。

我最初在这里找到了这个解决方案:https://forums.developer.apple.com/thread/103913


43
投票

我正在尝试核心数据。我为一个简单的清单程序构建了一个数据模型,并生成了NSManagedObjects。当我编译项目时,我收到以下错误:

error: Multiple commands produce '/Users/myUSerName/Library/Developer/Xcode/DerivedData/myCoreDateExperiment-gzbslaqdwglkzxemijpdqmizgyzc/Build/Intermediates.noindex/ myCoreDateExperiment /Debug-iphonesimulator/ myCoreDateExperiment.build/Objects-normal/x86_64/CheckListItem+CoreDataProperties.o':
1) Target ' myCoreDateExperiment ' (project ' myCoreDateExperiment ') has compile command for Swift source files
2) Target ' myCoreDateExperiment ' (project ' myCoreDateExperiment ') has compile command for Swift source files

问题是数据模型(在我的例子中是CheckList.xcdatamodeld)在“编译源”列表中。当我从列表中删除它时,项目编译得很干净。

  1. 打开项目导航器并选择项目(顶部的第一个条目)
  2. 在“项目和目标”窗格中的“目标”下选择您的构建目标
  3. 选择顶部附近的Build Phases选项
  4. 展开“编译源”条目并查找数据模型名称。如果您无法找到它,请搜索“xcdatamodeld”。
  5. 从编译列表中删除模型
  6. 确保数据模型包含在“复制包资源”列表中。如果缺少则添加它。

34
投票

在检查构建日志时,我注意到了一个警告:

note: Using new build system
note: Planning build
note: Constructing build description
Build system information
warning: The Copy Bundle Resources build phase contains this target's Info.plist file '/Users/<redacted>/Repositories/Whitesmith/optimize-ios/Carthage/Checkouts/WSStatusBarNotification/Miscellaneous/Info.plist'. (in target 'JDStatusBarNotification')

所以,如果那是你的情况,那么就去你的目标:

  1. 建立阶段
  2. 复制捆绑资源
  3. 删除info.plist

27
投票

如果您使用CocoaPods,您可能想尝试解除pod并重新安装。这个对我有用。

pod deintegrate

pod install


26
投票

试试这个工作:

在Xcode中,转到文件 - >项目/工作区设置。

将构建系统更改为Legacy Build系统。

© www.soinside.com 2019 - 2024. All rights reserved.