Flutter: 多个命令产生 '/build/ios/Debug-iphonesimulator/Runner.app/Frameworks/Flutter.framework

创建于 2018-08-16  ·  50评论  ·  资料来源: flutter/flutter

当我想在 MacOs 环境中调试应用程序时,它会抛出这样的错误:

多个命令产生 '/build/ios/Debug-iphonesimulator/Runner.app/Frameworks/Flutter.framework
1) 目标 'Runner' 具有从 '/ios/Flutter/Flutter.framework' 到 '/build/ios/Debug-iphonesimulator/Runner.app/Frameworks/Flutter.framework' 的复制命令
2) 该命令取决于 Target 'Runner' 中的命令:脚本阶段“[CP] Embed Pods Frameworks”
警告:忽略重复的输出文件:'//build/ios/Debug-iphonesimulator/Runner.app/Frameworks/Flutter.framework'(在目标'Runner'中)
注意:使用新的构建系统注意:规划构建注意:构建构建描述

Mac 10.14 测试版
Xcode 10 测试版

如何解决? 非常感谢

annoyance crowd platform-ios crash tool

最有用的评论

我能够通过在 Xcode 10 中打开Runner工作区项目来修复它。然后导航到FileWorkspace Settings并将构建系统更改为Legacy Build System

schermafbeelding 2018-08-16 om 14 10 10

所有50条评论

你能提供如何复制的确切步骤吗?
你是如何创建项目的?
您更改了哪些文件,做了哪些更改?

请添加flutter doctor -v的输出。

我能够通过在 Xcode 10 中打开Runner工作区项目来修复它。然后导航到FileWorkspace Settings并将构建系统更改为Legacy Build System

schermafbeelding 2018-08-16 om 14 10 10

多谢! 有用。

受影响的项目

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

解决方法

有两种解决方法:

  • 选项 1:使用旧版构建系统。 正如@gi097所指出的,打开ios/Runner.xcworkspace ,并将构建系统更改为Legacy Build System
  • 选项 2:使用新的 Xcode 10 构建系统。

    1. 打开ios/Runner.xcworkspace

    2. 在项目导航器侧栏中选择Runner项目。

    3. 在主视图中,选择Runner目标,然后选择Build Phases选项卡。

    4. 展开Embed Frameworks阶段并从嵌入式框架列表中选择Flutter.framework

    5. 单击-从列表中删除Flutter.framework (确保保留App.framework )。

根本原因

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

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

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

立即修复

直接的修复是让我们找到一种方法来自动选择重新加入旧版构建修复,直到出现更长期的更好解决方案。 以前的测试版支持-useNewBuildSystem=NO-useModernBuildSystem=NO但看起来这在 GM 版本中被删除了。 看起来目前这样做的方法是将键值对( <key>BuildSystemType</key><string>Original</string> )添加到ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings

长期修复

最简单的选择是从上面的 Embed Frameworks 步骤中消除 Flutter.framework 并始终依赖 pod install,即使在没有插件依赖项的情况下也是如此。 我们需要更新 Flutter 工具以自动编辑现有项目,以从 Embed Frameworks 步骤中删除 Flutter.framework。

亲:更简单的代码。 con:使 cocoapods 成为 Flutter 开发所需的安装步骤,首次运行需要大量且非常缓慢地下载他们的 repo。

一个更好的选择是让我们自动检测项目是否使用插件,并编辑 Xcode 项目以在插件正在使用时自动检查并从 Embed Frameworks 步骤中删除 Flutter.framework,否则添加它。

优点:更好的用户体验。 con:更复杂的代码。

无论哪种方式,我们都需要某种机制来自动编辑 project.pbxproj 文件并从嵌入框架构建步骤中删除框架。 支持将它重新添加进来并不是很多增量工作,而是会带来更好的体验。

/cc @tvolkert @gspencergoog @dnfield

抱歉,我无意淹没您的问题跟踪器。

我遵循了这个决议#20685

但现在它导致以下错误

captura de tela 2018-09-18 as 10 06 38 am

任何人都知道如何解决这个问题?
@gi097 @cbracken @zoechi @sidealice @hungrymonkey

@tiagosito补丁将暂时登陆master分支。 暂时请参阅上面我的评论中列出的解决方法。

@tiagosito补丁将立即登陆 master。 暂时请参阅上面我的评论中列出的解决方法。

@cbracken我遵循了您报告的选项 2 #20685

但是我遇到了这个小问题#21989

是这样解决的#21989

我没有使用主频道,当您提到的补丁发布时,我会在测试频道上使用相同的解决方案吗?

@cbracken@gi097现在非常感谢你

今天早些时候在转到 iOS 12 后也遇到了这个问题,然后需要 xcode 10,然后破坏了 flutter。 上面的选项 2 有效,但您应该清除包构建缓存:

~/flutter/.pub-cache/hosted/
flutter clean
flutter packages get

否则你会挠头。

我上面评论中的“立即修复”已经落在了主人身上。 尽快将其发送到dev频道。

仅供参考,这现已登陆dev频道。

伟大的!
顺便说一句,我们如何在现有项目中应用此补丁? 只需通过颤振升级?

@tadejkan你会想要运行flutter channel dev切换到开发频道然后flutter upgrade

@cbracken仍然存在的疑问是......我们将使用传统的编译模式,否则补丁将已经针对新的编译模式进行了修正。

换句话说,补丁是应用您在此处介绍的第 1 步或第 2 步的解决方案,还是已经是最终解决方案,以及该补丁何时应用到 Beta 渠道?

@tiagosito我登陆的补丁实现了上面的“立即修复”(选择回到 Xcode 10 之前的构建系统),这为我们

对此的正确解决方案是让我们检测何时使用 CocoaPods/插件,并在这些情况下依靠 CocoaPods 将Flutter.framework嵌入到输出应用程序中,对于所有其他情况,我们自己调用嵌入步骤。 接下来我将致力于此。

我在构建 ios 时遇到了问题,我现在整整 4 天都无法解决……因为我尝试了很多事情和组合,现在变得非常无助; 变得非常困惑和悲伤。
这是多个不同错误后的最新错误:

duplicate symbol _OBJC_IVAR_$_MDMPasscodeCache._localAuthenticationInfo in: /Volumes/flutter/ios/Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision(MDMPasscodeCache_f189776e75765630b82721fafea64052.o) /Volumes/flutter/ios/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn(MDMPasscodeCache_42de90102bb6814d03833694aafcc99d.o) duplicate symbol _OBJC_IVAR_$_MDMPasscodeCache._keychainInfo in: /Volumes/flutter/ios/Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision(MDMPasscodeCache_f189776e75765630b82721fafea64052.o) /Volumes/flutter/ios/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn(MDMPasscodeCache_42de90102bb6814d03833694aafcc99d.o) duplicate symbol _OBJC_IVAR_$_MDMPasscodeCache._hasLocalAuthentication in: /Volumes/flutter/ios/Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision(MDMPasscodeCache_f189776e75765630b82721fafea64052.o) /Volumes/flutter/ios/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn(MDMPasscodeCache_42de90102bb6814d03833694aafcc99d.o) duplicate symbol _OBJC_IVAR_$_MDMPasscodeCache._hasKeychain in: /Volumes/flutter/ios/Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision(MDMPasscodeCache_f189776e75765630b82721fafea64052.o) /Volumes/flutter/ios/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn(MDMPasscodeCache_42de90102bb6814d03833694aafcc99d.o) duplicate symbol _OBJC_IVAR_$_MDMPasscodeCache._cachedState in: /Volumes/flutter/ios/Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision(MDMPasscodeCache_f189776e75765630b82721fafea64052.o) /Volumes/flutter/ios/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn(MDMPasscodeCache_42de90102bb6814d03833694aafcc99d.o) duplicate symbol _OBJC_IVAR_$_MDMPasscodeCache._keychainExpireTime in: /Volumes/flutter/ios/Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision(MDMPasscodeCache_f189776e75765630b82721fafea64052.o) /Volumes/flutter/ios/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn(MDMPasscodeCache_42de90102bb6814d03833694aafcc99d.o) duplicate symbol _OBJC_CLASS_$_MDMPasscodeCache in: /Volumes/flutter/ios/Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision(MDMPasscodeCache_f189776e75765630b82721fafea64052.o) /Volumes/flutter/ios/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn(MDMPasscodeCache_42de90102bb6814d03833694aafcc99d.o) duplicate symbol _OBJC_METACLASS_$_MDMPasscodeCache in: /Volumes/flutter/ios/Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision(MDMPasscodeCache_f189776e75765630b82721fafea64052.o) /Volumes/flutter/ios/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn(MDMPasscodeCache_42de90102bb6814d03833694aafcc99d.o) duplicate symbol _OBJC_IVAR_$_MDMPasscodeCache._hasEnteredBackground in: /Volumes/flutter/ios/Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision(MDMPasscodeCache_f189776e75765630b82721fafea64052.o) /Volumes/flutter/ios/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn(MDMPasscodeCache_42de90102bb6814d03833694aafcc99d.o) duplicate symbol _OBJC_IVAR_$_MDMPasscodeState._status in: /Volumes/flutter/ios/Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision(MDMPasscodeState_d2697588db599ad1e82d46f342216cee.o) /Volumes/flutter/ios/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn(MDMPasscodeState_adbe96d99863168799049cc0f0164c6d.o) duplicate symbol _OBJC_IVAR_$_MDMPasscodeState._info in: /Volumes/flutter/ios/Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision(MDMPasscodeState_d2697588db599ad1e82d46f342216cee.o) /Volumes/flutter/ios/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn(MDMPasscodeState_adbe96d99863168799049cc0f0164c6d.o) duplicate symbol _OBJC_CLASS_$_MDMPasscodeState in: /Volumes/flutter/ios/Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision(MDMPasscodeState_d2697588db599ad1e82d46f342216cee.o) /Volumes/flutter/ios/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn(MDMPasscodeState_adbe96d99863168799049cc0f0164c6d.o) duplicate symbol _OBJC_METACLASS_$_MDMPasscodeState in: /Volumes/flutter/ios/Pods/GoogleMobileVision/Detector/Frameworks/GoogleMobileVision.framework/GoogleMobileVision(MDMPasscodeState_d2697588db599ad1e82d46f342216cee.o) /Volumes/flutter/ios/Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn(MDMPasscodeState_adbe96d99863168799049cc0f0164c6d.o) ld: 13 duplicate symbols for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

ld: 13 duplicate symbols for architecture x86_64
Launching lib/main.dart on iPhone XS Max in debug mode...
Xcode build done.
Failed to build iOS app
Error output from Xcode build:
↳
** BUILD FAILED **
Xcode's output:
↳
warning: The iOS Simulator deployment target is set to 4.3, but the range of supported deployment target versions for this platform is 8.0 to 12.0. (in target 'nanopb')
warning: The iOS Simulator deployment target is set to 6.0, but the range of supported deployment target versions for this platform is 8.0 to 12.0. (in target 'GoogleUtilities')
warning: The iOS Simulator deployment target is set to 7.0, but the range of supported deployment target versions for this platform is 8.0 to 12.0. (in target 'GTMSessionFetcher')
warning: The iOS Simulator deployment target is set to 7.0, but the range of supported deployment target versions for this platform is 8.0 to 12.0. (in target 'Protobuf')
warning: The iOS Simulator deployment target is set to 5.0, but the range of supported deployment target versions for this platform is 8.0 to 12.0. (in target 'leveldb-library')
warning: The iOS Simulator deployment target is set to 5.0, but the range of supported deployment target versions for this platform is 8.0 to 12.0. (in target 'BoringSSL')
warning: The iOS Simulator deployment target is set to 7.0, but the range of supported deployment target versions for this platform is 8.0 to 12.0. (in target 'gRPC-RxLibrary')
warning: The iOS Simulator deployment target is set to 7.0, but the range of supported deployment target versions for this platform is 8.0 to 12.0. (in target 'gRPC-Core')
warning: The iOS Simulator deployment target is set to 7.0, but the range of supported deployment target versions for this platform is 8.0 to 12.0. (in target 'gRPC-C++')
warning: The iOS Simulator deployment target is set to 7.0, but the range of supported deployment target versions for this platform is 8.0 to 12.0. (in target 'gRPC-gRPCCertificates')
warning: The iOS Simulator deployment target is set to 7.0, but the range of supported deployment target versions for this platform is 8.0 to 12.0. (in target 'gRPC')
warning: The iOS Simulator deployment target is set to 7.0, but the range of supported deployment target versions for this platform is 8.0 to 12.0. (in target 'gRPC-ProtoRPC')
warning: The iOS Simulator deployment target is set to 6.0, but the range of supported deployment target versions for this platform is 8.0 to 12.0. (in target 'cloud_firestore')
duplicate symbol __channel in:
/Users/erikiado/Code/internals/flutter/find_word/build/ios/Debug-iphonesimulator/audioplayers/libaudioplayers.a(AudioplayersPlugin.o)
/Users/erikiado/Code/internals/flutter/find_word/build/ios/Debug-iphonesimulator/firebase_admob/libfirebase_admob.a(FLTMobileAd.o)
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
note: Using new build systemnote: Planning buildnote: Constructing build description
Could not build the application for the simulator.
Error launching application on iPhone XS Max.
Exited (sigterm)

@erikiado@LiveRock您的问题(x86_64 模拟器版本上的重复符号)看起来与此无关。 请跟踪#22020 上的进度。

Beta 频道的预计到达时间?

@lukepighetti这现在被推送到beta频道(截至刚才)。 flutter upgrade走了!

修复了我的问题。 谢谢!

@sidealice这也适合你吗?

谢谢,解决方案 2 有效!

如果没有其他信息,很遗憾,我们不确定如何解决此问题。 因此,我们不情愿地暂时关闭此错误。 如果您对我们有更多信息,请不要犹豫,对错误发表评论; 我们将立即重新开放!
感谢您的贡献。
抄送@Hixie

多谢兄弟 ! 有用。

我仍然在 Flutter 稳定频道 v1.0.0 上遇到这个问题
修复应该是稳定的吗?

[✓] Flutter (Channel stable, v1.0.0, on Mac OS X 10.14.1 18B75, locale en-GB)
• Flutter 1.0.0 版位于 /usr/local/share/flutter
• 框架修订 5391447fae(3 周前),2018-11-29 19:41:26 -0800
• 引擎修订版 7375a0f414
• Dart 版本 2.1.0(构建 2.1.0-dev.9.4 f9ebf21297)

[✓] iOS 工具链 - 为 iOS 设备开发 (Xcode 10.1)
• Xcode 位于 /Applications/Xcode.app/Contents/Developer
• Xcode 10.1,构建版本 10B61
• ios 部署 2.0.0
• CocoaPods 1.5.3 版

@JannieT 也请检查dev
我不知道它是否应该在stable ,但如果它适用于dev ,答案可能是“不”。

谢谢! 只是为了确认,修复程序在稳定版 v1.0.0 中
我遇到了这个问题,因为我在尝试构建存档时打开了 .xcodeproject 文件而不是记录的 .xcworkspace。

我现在有同样的问题。

error: Multiple commands produce '/Users/n.gendron/Library/Developer/Xcode/DerivedData/Runner-eilfeqiwvjuvbghjmkepqybkaoja/ArchiveIntermediates/Runner/InstallationBuildProductsLocation/Applications/Runner.app/Frameworks/Flutter.framework':
1) Target 'Runner' has copy command from '/Users/n.gendron/Documents/GitLab/techno_store/ios/Flutter/Flutter.framework' to '/Users/n.gendron/Library/Developer/Xcode/DerivedData/Runner-eilfeqiwvjuvbghjmkepqybkaoja/ArchiveIntermediates/Runner/InstallationBuildProductsLocation/Applications/Runner.app/Frameworks/Flutter.framework'
2) That command depends on command in Target 'Runner': script phase “[CP] Embed Pods Frameworks”
[✓] Flutter (Channel dev, v1.2.2, on Mac OS X 10.13.6 17G5019, locale fr-CA)
    • Flutter version 1.2.2 at /Library/flutter
    • Framework revision 007a415c2a (5 days ago), 2019-02-21 20:22:47 -0800
    • Engine revision f1f19bba8f
    • Dart version 2.2.0 (build 2.2.0-dev.2.1 c92d5ca288)

[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    • Android SDK at /Users/n.gendron/Library/Android/sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-28, build-tools 28.0.3
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)
    • All Android licenses accepted.

[✓] iOS toolchain - develop for iOS devices (Xcode 10.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 10.1, Build version 10B61
    • ios-deploy 1.9.4
    • CocoaPods version 1.6.1

[✓] Android Studio (version 3.3)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 33.1.1
    • Dart plugin version 182.5215
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)

[✓] VS Code
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 2.12.2

[✓] Connected device (1 available)
    • iPad de TechnoSolutions • 3e430eb4db265d124e9684f487cc542f2442ed1d • ios • iOS 10.3.3

• No issues found!

我尝试了Legacy Build System ,但后来我遇到了另一个问题。 我也尝试删除Flutter.framework ,但错误是一样的。

#import <barcode_scan/BarcodeScanPlugin.h> # 'barcode_scan/BarcodeScanPlugin.h' file not found

受影响的插件是barcode_scan


为我解决的是https://github.com/apptreesoftware/flutter_barcode_reader/issues/44#issuecomment -460415307。

open -a Xcode ios

重新开放,因为我们目前只找到了解决方法,而不是迁移到新构建系统的长期修复。

如果没有其他信息,很遗憾,我们不确定如何解决此问题。 因此,我们不情愿地暂时关闭此错误。 如果您对我们有更多信息,请不要犹豫,对错误发表评论; 我们将立即重新开放!
感谢您的贡献。

帮助我使扑动干净,然后通过 android studio 构建

[✓] Flutter (Channel beta, v1.3.8, on Mac OS X 10.14.4 18E226, locale en-AU)
    • Flutter version 1.3.8 at /Users/yantsui/Installs/flutter
    • Framework revision e5b1ed7a7f (6 weeks ago), 2019-03-06 14:23:37 -0800
    • Engine revision f4951df193
    • Dart version 2.2.1 (build 2.2.1-dev.0.0 571ea80e11)

[✗] Android toolchain - develop for Android devices
    ✗ Unable to locate Android SDK.
      Install Android Studio from: https://developer.android.com/studio/index.html
      On first launch it will assist you in installing the Android SDK components.
      (or visit https://flutter.io/setup/#android-setup for detailed instructions).
      If the Android SDK has been installed to a custom location, set ANDROID_HOME to that location.
      You may also want to add it to your PATH environment variable.


[✓] iOS toolchain - develop for iOS devices (Xcode 10.2)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 10.2, Build version 10E125
    • ios-deploy 1.9.4
    • CocoaPods version 1.6.1

[!] Android Studio (not installed)
    • Android Studio not found; download from https://developer.android.com/studio/index.html
      (or visit https://flutter.io/setup/#android-setup for detailed instructions).

[✓] IntelliJ IDEA Ultimate Edition (version 2018.3.5)
    • IntelliJ at /Applications/IntelliJ IDEA.app
    • Flutter plugin version 34.0.2
    • Dart plugin version 183.5912.23

[!] VS Code (version 1.33.0)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    ✗ Flutter extension not installed; install from
      https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter

[✓] Connected device (1 available)
    • iPhone Xʀ • 39D838DF-E49E-4F0A-8F40-B73C91700F6E • ios • com.apple.CoreSimulator.SimRuntime.iOS-12-2 (simulator)

! Doctor found issues in 3 categories.
flutter clean
flutter build ios
Xcode 10 -> Product -> Clean Build Folder
Xcode 10 -> Product -> Run

Xcode 中的错误:

Showing All Messages
:-1: Multiple commands produce '/Users/meow/Documents/meow/crystal/build/ios/Debug-iphonesimulator/Runner.app/Frameworks/Flutter.framework':
1) Target 'Runner' has copy command from '/Users/meow/Documents/meow/crystal/ios/Flutter/Flutter.framework' to '/Users/meow/Documents/meow/crystal/build/ios/Debug-iphonesimulator/Runner.app/Frameworks/Flutter.framework'
2) That command depends on command in Target 'Runner': script phase “[CP] Embed Pods Frameworks”

固定的:
open -a Xcode ios但似乎没有用。
因此,我使用Runner.xcworkspace在 Xcode 中打开了该项目,并且它起作用了。

即使我通过工作区打开项目,这个问题仍然发生在我身上。 只有将构建系统更改为旧版似乎才能修复它。

我们还可以利用 CocoaPods 安装选项 disable_input_output_paths,它从 [CP] Emded Pods Framework 构建阶段删除输入和输出文件。 添加该安装选项是因为即使输入文件被触摸,新的 Xcode 构建系统也无法运行脚本。 请参阅https://www.ralfebert.de/ios/blog/cocoapods-clean-input-output-files。

优点:

  • Xcode 项目将使用新的构建系统而不会出现编译错误。 Xcode 一直威胁要取消旧版构建支持,因此 Flutter 会在发生这种情况时做好准备。
  • 简单的修复。
  • 没有额外的逻辑来决定是否在嵌入框架构建阶段包含 Flutter.framework,因为它将始终包含在内。
  • 如果项目是没有包的 vanilla Flutter,则不需要 CocoaPods 成为依赖项。

缺点:

  • Pods-Runner-frameworks.sh 脚本会在每次构建时运行,即使 Flutter.framework 没有改变。 在我的 2018 年 MacBook Pro 上,这增加了大约 1 秒的构建时间。
  • 如果新的 Xcode 构建系统错误得到解决,CocoaPods 可能会删除该安装选项,重复框架副本问题将重新出现。
  • 当引入 disable_input_output_paths 选项时,最低 CocoaPods 版本需要从 1.0.0 增加到 1.6.0。

@jmagman 太棒了! 这种方法对我来说看起来不错。 如果我们看到插件 Cocoapods 的编译成本非常高,我们可以将其作为优化处理。 这同时解决了眼前的风险!

谢谢!!!!!

谢谢

如果您仍然看到此错误,则需要迁移 Xcode 项目:

  1. 文件 > 工作区设置... > 构建系统,将下拉菜单更改为新建构建系统(默认)
  2. 在您的 Podfile 中,添加行
install! 'cocoapods', :disable_input_output_paths => true

例如,请参见https://github.com/flutter/flutter/blob/master/examples/platform_view/ios/Podfile

  1. 在 Runner 目标“[CP] Embed Pods Framework”构建阶段,删除所有输出文件。

@jmagman谢谢 - 但这可能与 #18673 有关吗? 因为在迁移后(通过flutter upgrade ,它在我的机器上自动在 Podfile 中执行此更改),我可以使用flutter build ios进行构建,但是当尝试在 Xcode 中存档时,我在错误中运行 # 18673。

@jmagman谢谢 - 但这可能与 #18673 有关吗? 因为在迁移后(通过flutter upgrade ,它在我的机器上自动在 Podfile 中执行此更改),我可以使用flutter build ios进行构建,但是当尝试在 Xcode 中存档时,我在错误中运行 # 18673。

@jmagman我找到了解决方案,实际上这个https://github.com/flutter/flutter/issues/16246#issuecomment -476329255 解决了我的问题。 任何不便敬请谅解。

@jmagman对于我们这些不太熟悉 XCode 的人,您能否进一步解释一下第 3 步? Runner 目标“[CP] Embed Pods Framework”构建阶段在哪里找到以删除所有输出文件?

找到了。 单击左侧导航栏中的“Runner”,然后单击“Build Phases”选项卡,然后向下滚动到“Output Files”,选择所有文件,然后单击减法按钮将其删除

如果没有 Mac,我该如何解决这个问题? 我使用云管道为 iOS 构建但需要解决这个问题...

如果您仍然看到此错误,则需要迁移 Xcode 项目:

  1. 文件 > 工作区设置... > 构建系统,将下拉菜单更改为新建构建系统(默认)
  2. 在您的 Podfile 中,添加行
install! 'cocoapods', :disable_input_output_paths => true

例如,请参见https://github.com/flutter/flutter/blob/master/examples/platform_view/ios/Podfile

  1. 在 Runner 目标“[CP] Embed Pods Framework”构建阶段,删除所有输出文件。

或者您可以执行 #1 和 #2,然后从 ios 目录运行pod install ,CocoaPods 应该会在构建阶段自动删除该输出文件。

@gincos如果您没有 Mac,您可以查看 PR https://github.com/flutter/flutter/pull/33684/以获取有关如何手动调整 Xcode 文件的示例。 如果您有 Mac,请按照上述步骤操作!

  1. 删除文件 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings。 这就是文件 > 工作区设置... > 构建系统 > 新构建系统(默认)在幕后发生的事情。
    https://github.com/flutter/flutter/pull/33684/files#diff -e7ad834b29956b3cbd9225dc81f2c06a

    1. 在您的 Podfile 中,添加行

      install! 'cocoapods', :disable_input_output_paths => true

      https://github.com/flutter/flutter/pull/33684/files#diff -4e7de62cf4dff9802f06b7f3cb120939

希望您的云管道应该运行pod install并为您处理上面的 #3。

如果您仍然看到错误,您可以编辑 ios/Runner.xcodeproj/project.pbxproj 以手动删除输出文件。 这样做请小心! Xcode 项目文件不喜欢损坏。
https://github.com/flutter/flutter/pull/33684/files#diff -e9e57f7f2e911a135acd8f08e79b20e1

@jmagman谢谢! 这就像一个魅力! 是的,云提供商运行 pod install,现在它在最新的 Beta 版中为 Android 和 iOS 生成正确的工件。

受影响的项目

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

解决方法

有两种解决方法:

  • 选项 1:使用旧版构建系统。 正如@gi097所指出的,打开ios/Runner.xcworkspace ,并将构建系统更改为Legacy Build System
  • 选项 2:使用新的 Xcode 10 构建系统。

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

根本原因

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

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

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

立即修复

直接的修复是让我们找到一种方法来自动选择重新加入旧版构建修复,直到出现更长期的更好解决方案。 以前的测试版支持-useNewBuildSystem=NO-useModernBuildSystem=NO但看起来这在 GM 版本中被删除了。 看起来目前这样做的方法是将键值对( <key>BuildSystemType</key><string>Original</string> )添加到ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings

长期修复

最简单的选择是从上面的 Embed Frameworks 步骤中消除 Flutter.framework 并始终依赖 pod install,即使在没有插件依赖项的情况下也是如此。 我们需要更新 Flutter 工具以自动编辑现有项目,以从 Embed Frameworks 步骤中删除 Flutter.framework。

亲:更简单的代码。 con:使 cocoapods 成为 Flutter 开发所需的安装步骤,首次运行需要大量且非常缓慢地下载他们的 repo。

一个更好的选择是让我们自动检测项目是否使用插件,并编辑 Xcode 项目以在插件正在使用时自动检查并从 Embed Frameworks 步骤中删除 Flutter.framework,否则添加它。

优点:更好的用户体验。 con:更复杂的代码。

无论哪种方式,我们都需要某种机制来自动编辑 project.pbxproj 文件并从嵌入框架构建步骤中删除框架。 支持将它重新添加进来并不是很多增量工作,而是会带来更好的体验。

/cc @tvolkert @gspencergoog @dnfield

@cbracken 非常感谢,它有效,感谢您的帮助

重新复制真正的迁移,因为它已经被掩埋了。

如果您仍然看到此错误,则需要迁移 Xcode 项目:

  1. 文件 > 工作区设置... > 构建系统,将下拉菜单更改为新建构建系统(默认)
  2. 在您的 Podfile 中,添加行
install! 'cocoapods', :disable_input_output_paths => true

例如,请参见https://github.com/flutter/flutter/blob/master/examples/platform_view/ios/Podfile

  1. 运行flutter build ios

我将锁定它,以便这些迁移说明保留在本期的末尾。 如果按照这些说明操作后还有其他问题,请提交新问题。

更新:如果您按照https://flutter.dev/docs/development/ios-project-migration 上的迁移说明进行操作,您可以从ios/Podfile删除install! 'cocoapods', :disable_input_output_paths => true ios/Podfile 。 如果您使用 Flutter 插件,这可能会缩短编译时间。

此页面是否有帮助?
0 / 5 - 0 等级