我们正在为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 install
或pod 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
,但是我不知道如何。
答案 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 Resources
将xcassets
添加到输入文件中,并与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开始正式使用旧版构建系统。