Xcode新构建系统中的CocoaPods“复制Pod资源”在输出文件中有Assets.car,并与“复制Bundle资源”发生冲突。

7
我们正在使用新的构建系统和Cocoapods 1.7.5来开发我们的Xcode项目。我们的项目(让我们称它为Y)实际上是一个开发pod,但我们还编写了一些代码来创建应用程序演示(你知道的,为了使构建更快,迭代更快)。这些演示代码(例如AppDelegate.swift、启动任务等)未包含在开发pod中。其余约90%的源代码和资源文件(如i18n字符串和图像资源)被打包到开发pod中供另一个项目(让我们称之为X)使用。
在开发过程中,Y的大部分变化发生在dev pod部分,因此我们需要确保每个更改都包含在X执行pod install时。
最近我们遇到了一个问题:
error: Multiple commands produce '/Users/x/Library/Developer/Xcode/DerivedData/Y-cawteybtitmeiafweribgqzkuhnr/Build/Products/Debug-iphoneos/Y.app/Assets.car':
1) Target 'Y' (project 'Y') has compile command with input '/Users/name/DEV/workspace/Y/SupportFiles/Assets.xcassets'
2) That command depends on command in Target 'Y' (project 'Y'): script phase “[CP] Copy Pods Resources”

经过多次在Google上搜索“多个命令生成assets.car”后,我们终于看到一个靠谱的解释:说明如下所示:

*.xcassets的"复制bundle资源"—>Assets.car

* [CP]复制pods资源的*.xcassets—>其他Assets.car

第一个覆盖了新构建系统中的第二个,这就是原因。

当我们从[CP] Copy Pods Resource的输出文件中手动删除${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Assets.car时,错误消失了,一切正常。但是,每当我们git checkout到另一个分支,或者运行pod installpod update时,${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Assets.car再次出现在[CP] Copy Pods Resource的输出文件中的可能性非常高。我们需要不断地手动删除它,这很繁琐和令人沮丧。
然后我们开始质疑:谁是幕后推手?谁负责将${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Assets.car添加到[CP] Copy Pods Resource的输出文件中?我们的注意力集中在Y.podspec上,发现了以下几行:
  s.resource_bundles = {
    'Y' => ['Resources/*'], # assets, lottie etc.
    'YAuto' => ['auto_resources/*'] # i18n strings etc.
  }

我们以为我们在错误地使用资源(resources)包,因此我们再次搜索了谷歌(Google)。令人惊讶的是,在官方文档中推荐使用资源(bundle)包而不是资源(resources)。此外,我们没有发现任何关于资源(bundle)包的不当用法,这使我们无法选择。

有人能帮忙吗?我想也许我们可以在Podfilepost_install脚本中修补Y.xcworkspace,但我不知道怎么做。


可能与 https://github.com/CocoaPods/CocoaPods/issues/8431 相关的编程内容。 - Paul Beusterien
不幸的是,你链接中提出的解决方案都没有成功地解决我的问题。无论如何,还是谢谢! - Houston Duane
相关帖子及其解决方法:https://dev.to/kylefoo/xcode-12-new-build-system-warns-multiple-commands-produce-assets-car-56im - maganap
3个回答

5
我通过在Podfile中编写一个post_install脚本解决了这个问题,该脚本会自动删除这些Assets.car文件。
post_install do |installer|
    project_path = 'Y.xcodeproj'
    project = Xcodeproj::Project.open(project_path)
    project.targets.each do |target|
        build_phase = target.build_phases.find { |bp| bp.display_name == '[CP] Copy Pods Resources' }
        assets_path = '${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Assets.car'
        if build_phase.present? && build_phase.output_paths.include?(assets_path) == true
            build_phase.output_paths.delete(assets_path)
        end
    end
    project.save(project_path)
end

现在看来这似乎是一个CocoaPods的bug,但它仍未被修复。


build_phase.output_paths.include?中出现了undefined method 'include'? for nil:NilClass的错误。 - Rickard Elimää
你可能需要在 Podfile 的顶部添加 require 'xcodeproj' - Houston Duane
感谢您的回答和说明。我其实只是通过运行 pod update 来解决了这个问题。问题可能是由我们使用的众多框架中的一个旧版本造成的。 - Rickard Elimää

4
这个问题有多种表现形式,有些像上面描述的问题,有时则是因为在iOS应用程序中添加了分享扩展或手表应用程序。无论哪种情况,都是由于这些目标中存在多个Assets.car输出导致创建了重复的Assets.car文件。[CP] Copy Pods Resources出现这种情况时,编译器显然不知道如何处理,因此我们不能允许CocoaPods生成具有相同名称的多个输出文件。
根据CocoaPods的问题描述,建议解决方案是将以下内容放入您的 Podfile 中:
# Default platform for most targets
platform :ios, '11.0'

# Workaround duplicate Assets.car issue https://github.com/CocoaPods/CocoaPods/issues/8122
# This impacts the new Xcode build system
install! 'cocoapods', :disable_input_output_paths => true

Xcode 12还解决了一个相关问题,该问题使用新的构建系统时导致了构建性能问题,并通过这种解决方法进行了修复。遗留的构建系统在Xcode 12中已正式被弃用。


经过花费4个小时,这就是答案并解决了问题。谢谢。 - daspianist

2
已经过去了将近一个月,现在来更新一下。事实证明,这个问题是由于对另一个开发库 Y 的误用造成的。我们忘记在那个开发库的 Podspec 中使用 resource_bundles,导致该开发库的资源没有被打包进一个 .bundle 文件中,紧接着 [CP] Copy Pods Resources 明确地将一个 xcassets 添加到输入文件中,与 Copy Bundle Resources 中的另一个冲突。

1
嗨,使用 resource_bundles 我无法在 Xcode 12.5 中检索图像资源。Pod.bundle 中始终存在 Assets.car,无法检索图像资源。 - Lê Khánh Vinh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接