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

Hou*_*ane 7 xcode ios cocoapods podspec

我们在 Xcode 项目中使用新的构建系统和 Cocoapods 1.7.5。我们的项目(我们称之为 Y)实际上是一个开发 pod,但我们还编写了一些代码来创建应用程序演示(您知道,为了使构建更快、迭代更快)。这些演示代码(AppDelegate.swift、启动任务等)不包含在开发容器中。剩余的大约 90% 的源代码和资源文件(例如 i18n 字符串和图像资源)被打包到开发 pod 中,供另一个项目(我们称之为 X)使用。

\n

在开发过程中,大部分更改发生在 Y 的 dev pod 部分,因此我们需要确保 X 执行时包含所有更改pod install

\n

最近我们遇到一个问题:

\n
error: Multiple commands produce \'/Users/x/Library/Developer/Xcode/DerivedData/Y-cawteybtitmeiafweribgqzkuhnr/Build/Products/Debug-iphoneos/Y.app/Assets.car\':\n1) Target \'Y\' (project \'Y\') has compile command with input \'/Users/name/DEV/workspace/Y/SupportFiles/Assets.xcassets\'\n2) That command depends on command in Target \'Y\' (project \'Y\'): script phase \xe2\x80\x9c[CP] Copy Pods Resources\xe2\x80\x9d\n
Run Code Online (Sandbox Code Playgroud)\n

经过几个小时的multiple commands produce assets.car谷歌搜索,我们终于看到了一个合理的解释

\n
\n

复制捆绑资源的 *.xcassets --> Assets.car

\n

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

\n

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

\n
\n

${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出现在 的输出文件中[CP] Copy Pods Resource。我们需要一次又一次手动删除它,这是乏味且令人沮丧的。

\n

然后我们开始质疑:谁是这一切的幕后黑手?谁负责添加${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Assets.car到 的输出文件[CP] Copy Pods Resource?我们把目光集中在上面Y.podspec,发现了这些线条:

\n
  s.resource_bundles = {\n    \'Y\' => [\'Resources/*\'], # assets, lottie etc.\n    \'YAuto\' => [\'auto_resources/*\'] # i18n strings etc.\n  }\n
Run Code Online (Sandbox Code Playgroud)\n

我们认为我们用resource_bundles错了,所以我们再次在谷歌上查找。令人惊讶的是,官方文档推荐使用resource_bundlesover 。此外,我们找不到任何不恰当的用法,这让我们别无选择。resourcesresource_bundles

\n

有人可以帮忙吗?我在想也许我们可以修补Y.xcworkspacepost_install的脚本Podfile,但我不知道如何做。

\n

Hou*_*ane 5

我通过编写一个post_install脚本来解决这个问题,在Podfile该脚本中自动删除这些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
Run Code Online (Sandbox Code Playgroud)

这似乎是 CocoaPods 的一个 bug,目前还没有修复。


Hou*_*ane 2

已经过去近一个月了,这里有一个更新。原来这个问题是由于误用了另一个开发pod而引起的Yresource_bundles我们忘记在该 dev pod 的 中使用Podspec,这导致该 dev pod 的资源没有被打包到文件中.bundle,然后[CP] Copy Pods Resources显式地将 an 添加xcassets到输入文件中,与Copy Bundle Resources.