Xcode新构建系统CocoaPods“复制Pod资源”在输出文件中包含Assets.car,并与“复制捆绑资源”冲突

时间:2019-11-19 07:33:33

标签: ios xcode cocoapods podspec

我们正在为Xcode项目使用新的构建系统和Cocoapods 1.7.5。我们的项目(我们称它为Y)实际上是一个开发容器,但我们也编写了一些代码来创建应用程序演示(您知道,可以加快构建速度并加快迭代速度)。这些演示代码(AppDelegate.swift,启动任务等)未包含在开发窗格中。其余约90%的源代码和资源文件(例如i18n字符串和图像资源)被打包到开发吊舱中,供另一个项目(称为X)使用。

在开发过程中,大多数更改都发生在Y的开发包部分,因此我们需要确保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搜索multiple commands produce assets.car,我们终于看到了一个合理的explanation

  

*。xcassets副本捆绑资源-> Assets.car

     

*。xcassets of [CP] Copy Pods Resource->其他Assets.car

     

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

当我们从${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Assets.car的输出文件中手动删除[CP] Copy Pods Resource时,错误消失了,一切正常。但是,每当我们git checkout到另一个分支,pod installpod update时,${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Assets.car很有可能再次出现在{{1 }}。我们需要一次又一次地手动将其删除,这既繁琐又令人沮丧。

然后我们开始质疑:这一切背后的人是谁?谁负责将[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. } 错误,因此我们再次在Google上进行了查找。令人惊讶的是,official documentation建议在resource_bundles上使用resource_bundles。此外,就resources而言,我们找不到任何不当用法,这使我们无法选择。

有人可以帮忙吗?我在想也许我们可以在resource_bundles的{​​{1}}脚本中修补Y.xcworkspace,但是我不知道如何。

3 个答案:

答案 0 :(得分:2)

我通过在#!/bin/sh hostname cpanel.mydomain.com /scripts/fixetchosts 中编写一个post_install脚本来解决此问题,该脚本会自动删除这些Podfile

Assets.car

这似乎是一个CocoaPods错误,目前尚未修复。

答案 1 :(得分:1)

已经快一个月了,这里是一个更新。原来,此问题是由于滥用Y的另一个开发包引起的。我们忘记了在该开发者容器的resource_bundles中使用Podspec,这导致该开发者容器的资源未打包到.bundle文件中,随后是[CP] Copy Pods Resourcesxcassets添加到输入文件中,并与Copy Bundle Resources中的另一个冲突。

答案 2 :(得分:1)

此问题的发生有多种方式;有些类似上述问题,另外一些时候除了iOS应用之外,还具有Share Extension或Watch应用。在所有情况下,这都是由创建重复的Assets.car文件的那些目标的[CP] Copy Pods Resources中有多个Assets.car输出引起的。显然,编译器不知道该如何处理,因此我们不应该允许CocoaPods生成多个具有相同名称的输出文件。

每个the CocoaPods issue的推荐解决方案是将其放入您的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开始正式使用旧版构建系统。