JMi*_*uel 11 xcode ios xcasset
在 Xcode 11 上,我的 .xcassets 不会在 Xcode 10 上引起任何问题,导致编译失败并显示以下消息:
错误:多个命令产生“/Users/user/Library/Developer/Xcode/DerivedData/project-enjiypsgxtcdbnaripixgtnjlagx/Build/Products/Debug-iphonesimulator/project.app/Assets.car”:1
)目标“项目”(项目“项目” ') 具有输入为 '/Users/user/sandbox/project/Resources/buttons.xcassets' 的编译命令
2) 该命令取决于目标 'project'(项目 'project')中的命令:脚本阶段“[CP] Copy Pods资源”
我能够编译项目的唯一方法是从目标中删除 .xcassets,明显的缺点是它们在构建中不可用。
PS:这发生在 2 个 ObjC 项目中。
rox*_*neM 16
上面的答案只是部分正确:是的,发生这种情况是因为 pod 阶段将Assets.car作为输出文件,这与您的xcassets的输出名称一致- 因此Multiple commands produce...
错误:一个命令是脚本阶段[CP] Copy Pods Resources
,另一个命令是您自己的项目编译命令。
但是从输出文件中删除Assets.car将导致构建系统无法看到脚本正在处理该文件,因此它会跳过它(阅读此了解更多详细信息)。所以我们可以做的是将 Assets.car添加到输入文件 - 这将为脚本创建一个依赖项,告诉构建系统在执行脚本之前等待文件。
注意:就像上面的解决方案一样,每次更新 Pod 后都必须执行此操作,因为[CP] Copy Pods Resources
每次运行pod install
或pod update
小智 16
在 pod 文件的顶部添加以下行,紧随其后 platform :ios
install! 'cocoapods', :disable_input_output_paths => true
Run Code Online (Sandbox Code Playgroud)
为了确保所有构建步骤都以正确的顺序执行,同时尽可能多地并行执行,Xcode 需要知道每个构建步骤它依赖哪些输入文件以及它将生成哪些输出文件。
例如,如果步骤 A 依赖于作为步骤 B 输出文件的输入文件,则步骤 B 肯定必须在步骤 A 之前运行。如果这两个步骤都不需要另一步骤的输出文件,则它们可以并行运行。
虽然几个步骤肯定可以依赖同一个输入文件,但不可能出现多个步骤产生与这种情况相同的输出文件的情况,最后运行的步骤将覆盖首先运行的步骤的输出文件,这意味着结果输出文件内容是不可预测的,这是构建过程中的一个错误,会产生可预测的结果!
在您的情况下,问题在于您的 Copy Resources 构建阶段包含一个(或多个).xcassets
包。Xcode 不只是复制这些包,而是将它们组合起来,转换和优化它们的内容,并创建一个名为的文件Assets.car
,其中包含项目中所有资产目录的内容。
然而,如果你集成了一个 Pod 并且这个 Pod 也有一个资产目录,同样的事情会发生,第二个Assets.car
文件被创建,现在 Xcode 有一个问题:两个构建步骤都说他们创建了一个Assets.car
文件。哪一个会赢?这两个文件中的哪一个会出现在最终申请中?那么依赖于这个文件的其他步骤呢?他们必须在哪些构建步骤之后运行?这是 Xcode 无法解决的严重问题。
目前有两种可能的解决方案:
使用框架。当您使用框架而不是静态库时,Pod 的资源最终不会在主应用程序的资源文件夹中,而是在构建框架的资源文件夹中。您需要做的就是添加use_frameworks!
到您的 Podfile 中,无论是顶级还是仅针对特定目标。缺点是您的整体应用程序大小会增加一点,应用程序启动时间会增加一点。
让 Pod 作者修复 Pod。作为 Podspec 文档的强烈推荐,而不是resources
他/她应使用resources_bundle
。使用resources
实际上还有其他缺点(资源文件没有优化,不同 Pod 之间可能会出现名称冲突),而使用资源包是安全的,无论 Pod 是作为静态库嵌入还是作为动态框架嵌入。但是请注意,仅更改 Podspec 是不够的,必须采用加载包资源的所有代码从正确的包中加载它们(名称将resources_bundle
在 Podspec 文件中使用时被称为,您还必须给出捆绑一个名称)。
这个问题有一个持续的错误报告,你可以在这里找到它:https :
//github.com/CocoaPods/CocoaPods/issues/8122
然而目前的问题是,除了上面提到的两个之外,所有可能的解决方案基本上都是一个丑陋的黑客,而 Cocoapods 开发人员并不乐意实施丑陋的黑客。最好的解决方案,尽管看起来很困难,但可能根本不解决该问题,而是停止resources
在 Podspec 文件中提供支持,并对resources_bundle
包含自己资源的Pod强制执行。
在您的库项目中,例如“LADetailPage”,打开 Targets 的“Build Phases”,创建一个名为“Copy Files”的预定义阶段,然后将您*.xcassets
的项目拖到新阶段。
然后库在构建时不会Assets.car
从*.xcassets
文件中生成,而是将 cocoapods 复制*.xcassets
到导入 lib 的主项目中,然后主项目将所有内容构建*.xcassets
到一个Assets.car
文件中。
归档时间: |
|
查看次数: |
7245 次 |
最近记录: |