Hou*_*ane 7 xcode ios cocoapods podspec
我们在 Xcode 项目中使用新的构建系统和 Cocoapods 1.7.5。我们的项目(我们称之为 Y)实际上是一个开发 pod,但我们还编写了一些代码来创建应用程序演示(您知道,为了使构建更快、迭代更快)。这些演示代码(AppDelegate.swift、启动任务等)不包含在开发容器中。剩余的大约 90% 的源代码和资源文件(例如 i18n 字符串和图像资源)被打包到开发 pod 中,供另一个项目(我们称之为 X)使用。
在开发过程中,大部分更改发生在 Y 的 dev pod 部分,因此我们需要确保 X 执行时包含所有更改pod install。
最近我们遇到一个问题:
\nerror: 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\nRun 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
${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。我们需要一次又一次手动删除它,这是乏味且令人沮丧的。
然后我们开始质疑:谁是这一切的幕后黑手?谁负责添加${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Assets.car到 的输出文件[CP] Copy Pods Resource?我们把目光集中在上面Y.podspec,发现了这些线条:
s.resource_bundles = {\n \'Y\' => [\'Resources/*\'], # assets, lottie etc.\n \'YAuto\' => [\'auto_resources/*\'] # i18n strings etc.\n }\nRun Code Online (Sandbox Code Playgroud)\n我们认为我们用resource_bundles错了,所以我们再次在谷歌上查找。令人惊讶的是,官方文档推荐使用resource_bundlesover 。此外,我们找不到任何不恰当的用法,这让我们别无选择。resourcesresource_bundles
有人可以帮忙吗?我在想也许我们可以修补Y.xcworkspace中post_install的脚本Podfile,但我不知道如何做。
我通过编写一个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,目前还没有修复。
已经过去近一个月了,这里有一个更新。原来这个问题是由于误用了另一个开发pod而引起的Y。resource_bundles我们忘记在该 dev pod 的 中使用Podspec,这导致该 dev pod 的资源没有被打包到文件中.bundle,然后[CP] Copy Pods Resources显式地将 an 添加xcassets到输入文件中,与Copy Bundle Resources.
| 归档时间: |
|
| 查看次数: |
10159 次 |
| 最近记录: |