添加WatchOS应用后Xcode运行Flutter应用遇Runner循环依赖错误
问题场景
给Flutter应用添加WatchOS应用后,Xcode运行时触发Runner目标内部循环依赖错误,导致无法构建运行,核心错误信息如下:
Target 'Runner' 存在从'/Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/chargeExtension.appex'到'/Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/Runner.app/PlugIns/chargeExtension.appex'的复制命令
○ 该命令依赖Target 'Runner'中的脚本阶段“[CP] Copy Pods Resources”
○ 该命令依赖Target 'Runner'中的脚本阶段“[CP] Embed Pods Frameworks”
○ 该命令依赖Target 'Runner'中的脚本阶段“Thin Binary”
○ Target 'Runner'存在输出为'/Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/Runner.app/Info.plist'的处理命令
○ Target 'Runner'存在从'/Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/chargeExtension.appex'到'/Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/Runner.app/PlugIns/chargeExtension.appex'的复制命令
原始依赖循环追踪:
target: -> node: -> command: -> node: /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Intermediates.noindex/Runner.build/Debug-iphonesimulator/Runner.build/Objects-normal/arm64/ExtractedAppShortcutsMetadata.stringsdata -> command: P0:target-Runner-18c1723432283e0cc55f10a6dcfd9e0288a783a885d8b0b3beb2e9f90bde3f49-:Debug:ExtractAppIntentsMetadata -> node: -> command: P0:::Gate target-Runner-18c1723432283e0cc55f10a6dcfd9e0288a783a885d8b0b3beb2e9f90bde3f49--fused-phase9-copy-files -> node: <Copy /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/Runner.app/Watch/zeon_watch Watch App.app> -> command: P0:target-Runner-18c1723432283e0cc55f10a6dcfd9e0288a783a885d8b0b3beb2e9f90bde3f49-:Debug:Copy /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/Runner.app/Watch/zeon_watch Watch App.app /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-watchsimulator/zeon_watch Watch App.app -> node: -> command: P0:::Gate target-Runner-18c1723432283e0cc55f10a6dcfd9e0288a783a885d8b0b3beb2e9f90bde3f49--fused-phase8-copy-files -> node: <Copy /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/Runner.app/PlugIns/chargeExtension.appex> -> CYCLE POINT -> command: P0:target-Runner-18c1723432283e0cc55f10a6dcfd9e0288a783a885d8b0b3beb2e9f90bde3f49-:Debug:Copy /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/Runner.app/PlugIns/chargeExtension.appex /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/chargeExtension.appex -> node: -> command: P0:::Gate target-Runner-18c1723432283e0cc55f10a6dcfd9e0288a783a885d8b0b3beb2e9f90bde3f49--fused-phase7--cp--copy-pods-resources -> node: /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/Runner.app/GoogleMapsResources.bundle -> command: P2:target-Runner-18c1723432283e0cc55f10a6dcfd9e0288a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution [CP] Copy Pods Resources /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Intermediates.noindex/Runner.build/Debug-iphonesimulator/Runner.build/Script-7A31133EF4437D7DDEFFA042.sh -> node: -> command: P0:::Gate target-Runner-18c1723432283e0cc55f10a6dcfd9e0288a783a885d8b0b3beb2e9f90bde3f49--fused-phase6--cp--embed-pods-frameworks -> node: /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/Runner.app/Frameworks/AppInvokeSDK.framework -> command: P2:target-Runner-18c1723432283e0cc55f10a6dcfd9e0288a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution [CP] Embed Pods Frameworks /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Intermediates.noindex/Runner.build/Debug-iphonesimulator/Runner.build/Script-3496F4E0C3D5FD3F1DAB8BC7.sh -> node: -> command: P0:::Gate target-Runner-18c1723432283e0cc55f10a6dcfd9e0288a783a885d8b0b3beb2e9f90bde3f49--fused-phase5-thin-binary -> node: -> command: P2:target-Runner-18c1723432283e0cc55f10a6dcfd9e0288a783a885d8b0b3beb2e9f90bde3f49-:Debug:PhaseScriptExecution Thin Binary /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Intermediates.noindex/Runner.build/Debug-iphonesimulator/Runner.build/Script-3B06AD1E1E4923F5004D2608.sh -> node: /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/Runner.app/Info.plist/ -> directoryTreeSignature: � -> directoryContents: /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/Runner.app/Info.plist -> node: /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/Runner.app/Info.plist -> command: P0:target-Runner-18c1723432283e0cc55f10a6dcfd9e0288a783a885d8b0b3beb2e9f90bde3f49-:Debug:ProcessInfoPlistFile /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/Runner.app/Info.plist /Users/ragulpr/Steam-A/zeon/ev-flutter/ios/Runner/Info.plist -> node: /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/Runner.app/PlugIns/chargeExtension.appex -> command: P0:target-Runner-18c1723432283e0cc55f10a6dcfd9e0288a783a885d8b0b3beb2e9f90bde3f49-:Debug:Copy /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/Runner.app/PlugIns/chargeExtension.appex /Users/ragulpr/Library/Developer/Xcode/DerivedData/Runner-dubuyvxkrtxsotfiyerxmyrtvdpv/Build/Products/Debug-iphonesimulator/chargeExtension.appex
构建阶段顺序截图:
解决方法
1. 移除重复的复制命令
- 打开Xcode,选中
Runner目标,进入Build Phases标签页 - 查找所有涉及
chargeExtension.appex的复制命令,删除反向复制的条目(仅保留将chargeExtension.appex复制到Runner.app/PlugIns/的命令)
2. 调整构建阶段顺序
确保构建阶段按以下标准顺序排列:
DependenciesCompile SourcesLink Binary With LibrariesCopy Bundle Resources[CP] Embed Pods Frameworks[CP] Copy Pods ResourcesThin BinaryEmbed App Extensions(若存在)Embed Watch Content
3. 清理构建缓存
- 执行
Product > Clean Build Folder(快捷键Cmd+Shift+K) - 删除DerivedData目录:终端运行
rm -rf ~/Library/Developer/Xcode/DerivedData - 进入ios目录执行
pod install
4. 检查WatchOS目标配置
- 确保WatchOS应用目标不依赖
Runner的扩展,反之亦然 - 确认
Runner的Embed Watch Content阶段仅包含WatchOS应用,未错误引入扩展文件
5. 验证Info.plist配置
- 检查
Runner的Info.plist是否存在对chargeExtension.appex的重复引用 - 确保扩展的
NSExtension配置仅在自身Info.plist中定义
内容的提问来源于stack exchange,提问作者Ragul PR

