在 Xcode 升级后 Flutter iOS 构建失败错误并带有多个命令

Posted

技术标签:

【中文标题】在 Xcode 升级后 Flutter iOS 构建失败错误并带有多个命令【英文标题】:Flutter iOS build failure error with Multiple commands after the Xcode upgrade 【发布时间】:2019-02-23 04:41:05 【问题描述】:

在 mac 中升级到 Xcode 10.0 版本后,Flutter ios 构建失败。

Nagendras-MacBook-Pro:uaenumber nagendra$ flutter run
Launching lib/main.dart on iPhone X in debug mode...
Starting Xcode build...
Xcode build done.                                            1.4s
Failed to build iOS app
Error output from Xcode build:
↳
    ** BUILD FAILED **

Xcode's output:
↳
    error: Multiple commands produce '/Users/dev/Documents/projects/Personal/uaenumber/build/ios/Debug-iphonesimulator/Runner.app/Frameworks/Flutter.framework':
    1) Target 'Runner' has copy command from '/Users/dev/Documents/projects/Personal/uaenumber/ios/Flutter/Flutter.framework' to '/Users/dev/Documents/projects/Personal/uaenumber/build/ios/Debug-iphonesimulator/Runner.app/Frameworks/Flutter.framework'
    2) That command depends on command in Target 'Runner': script phase “[CP] Embed Pods Frameworks”
    warning: The use of Swift 3 @objc inference in Swift 4 mode is deprecated. Please address deprecated @objc inference warnings, test your code with “Use of deprecated Swift 3 @objcinference” logging enabled, and then disable inference by changing the "Swift 3 @objc Inference" build setting to "Default" for the "Runner" target. (in target 'Runner')
    warning: ignoring duplicated output file: '/Users/nagendra/Documents/projects/Personal/uaedialer/build/ios/Debug-iphonesimulator/Runner.app/Frameworks/Flutter.framework' (in target 'Runner')
    note: Using new build systemnote: Planning buildnote: Constructing build description
Could not build the application for the simulator.
Error launching application on iPhone X.

Xcode 版本 - 10.0 (10A255)

我尝试重新创建项目并将所有源文件复制到新的项目文件夹,但它没有解决问题。

【问题讨论】:

重新升级此框架 Flutter.framework 时出错。所以再次检查你没有在项目构建阶段设置中嵌入框架,并且你在脚本中添加了这个框架,所以从它中删除并再次构建 你的意思是lib目录下的ios文件夹吗?早些时候它在 lib 文件夹中自动生成。需要手动添加吗? 我不熟悉 Flutter.framework 但您的错误表明它在构建设置中的嵌入式库以及您的编译器库中存在多个副本 github.com/flutter/flutter/issues/20685#issuecomment-421511890 可能会有所帮助 【参考方案1】:

这个解决方案对我有用。

    打开ios/Runner.xcworkspace 在项目中选择Runner项目 导航器侧边栏。 在主视图中,选择 Runner 目标,然后选择 Build Phases 选项卡。 展开 Embed Frameworks 阶段并从 嵌入式框架列表。 单击 - 从列表中删除 Flutter.framework(请务必保留 App.framework)。

【讨论】:

这应该是答案【参考方案2】:

这是一个已知问题。这是解释和一些解决方法: https://github.com/flutter/flutter/issues/20685#issuecomment-421511890

受影响的项目

此问题影响使用 Xcode 10 构建的所有 Flutter 项目 对 CocoaPods 的依赖——通常这意味着那些依赖于 插件。解决方法

有两种解决方法:

选项 1:使用旧版构建系统。如@gi097 所述,打开 ios/Runner.xcworkspace,并将构建系统更改为 Legacy Build 系统。 选项 2:使用新的 Xcode 10 构建系统。 打开 ios/Runner.xcworkspace 在项目导航器侧边栏中选择 Runner 项目。 在主视图中,选择 Runner 目标,然后选择 Build Phases 选项卡。 展开 Embed Frameworks 阶段并从嵌入式框架列表中选择 Flutter.framework。 点击 - 将 Flutter.framework 从列表中移除(一定要保留 App.framework)。

根本原因

使用插件时,有两个相互竞争的构建操作 将 Flutter.framework 复制到构建应用程序框架中 目录:

Runner 项目的嵌入框架构建阶段

pod install 在项目中创建的 [CP] Embed Pods Frameworks 构建阶段。

第 (1) 项用于确保将框架复制到构建的应用程序中 在没有插件的情况下(因此没有 CocoaPods 集成到 Xcode 项目中)。第 (2) 项存在是因为 Flutter 的 podspec 将 Flutter.framework 声明为 vended_framework,并且 CocoaPods 会自动为每个此类添加一个复制步骤 vended_framework 在 CocoaPods 依赖的传递闭包中。

【讨论】:

【参考方案3】:

此问题已通过在 Xcode 10 中打开 Runner 工作区项目得到修复。然后导航到文件、工作区设置并将构建系统更改为 Legacy Build System。

【讨论】:

【参考方案4】:

编辑: Flutter 的最新稳定版本会将您的 Xcode 项目迁移到新的构建系统(下面的第一步)并完全避免多个嵌入式框架警告。如果没有,请按照https://flutter.dev/docs/development/ios-project-migration 的说明进行操作。您不再需要编辑 Podfile(下面的第二步)。

见https://github.com/flutter/flutter/issues/20685#issuecomment-622126064

上一个答案

    在 Xcode 中打开 ios/Runner.xcworkspace。文件 > 工作区设置... > 构建系统,将下拉菜单更改为新构建系统(默认) 在您的 Podfile 中,添加该行
install! 'cocoapods', :disable_input_output_paths => true

3.在你的Flutter应用中,再次build触发pod install,会自动清理build阶段

flutter build ios

见: https://github.com/flutter/flutter/issues/20685#issuecomment-509731873 https://github.com/flutter/flutter/issues/20685#issuecomment-510162863

警告: 不要按照其他答案中的建议恢复到 Xcode 已弃用的旧版构建系统来解决此问题。

【讨论】:

【参考方案5】:

如果您已经尝试了所有方法,但仍然无法成功构建存档,那么您看起来就像我的情况。

我花了 3 个工作日来解决这个问题。我的问题是在将Notification Services 目标添加到项目后发生的。但它看起来也适用于许多其他情况:

这个问题是由于库里面的2个target多个命令产生的。例如,在我的情况下,在项目目标和通知扩展目标中,GoogleUtilities 都有这导致它们发生冲突或重复产生的命令。解决方案是在顶层明确依赖关系。 pod 文件将如下所示:

platform :ios, '10.0'
use_frameworks!
inhibit_all_warnings!

pod 'GoogleUtilities' // Add this line is very important.

target 'MyProject' do
  pod 'Firebase/Analytics'
  pod 'Firebase/Crashlytics'
  pod 'Firebase/Messaging'
# Other pods
end

target 'NotificationService' do
  pod 'Firebase/Messaging'
end

运行后:

pod deintegrate
pod install 

【讨论】:

非常感谢! 谢谢你是最棒的【参考方案6】:

我今天遇到了这个问题,没有解决它。然后我检查了我的 xcode 项目,我发现内部 runner 文件夹我发现另一个 runner 显示红色,这是以前不存在的。所以我删除它并重新运行我的项目,它解决了我的问题。

我尝试了上述方法,但没有解决我的问题。但是您可以尝试两种方法,看看哪一种适合您。

【讨论】:

以上是关于在 Xcode 升级后 Flutter iOS 构建失败错误并带有多个命令的主要内容,如果未能解决你的问题,请参考以下文章

iOS项目中集成Flutter的最新适配升级

在 Flutter 2 和 XCode 12.5 更新后发生的 Flutter unknown iOS 构建中的错误

升级后 Flutter 无法在 IOS 和 Android 上运行

animateWithDuration 在升级到 xcode 4.6 后导致 ios4 上的触摸事件出现问题

升级到 Xcode 4.2 和 iOS5 后,应用程序无法在 iPhone 上运行

升级到flutter 2.5.0后出现很多错误