Новая система сборки Xcode CocoaPods Copy Pods Resources имеет Assets.car в выходных файлах и конфликтует с Copy Bundle Resources

Мы используем новую систему сборки и Cocoapods 1.7.5 для нашего проекта Xcode. Наш проект (назовем его 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”

После нескольких часов поиска multiple commands produce assets.car в Google мы наконец увидели правдоподобное объяснение :

*.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 снова появится в выходных файлах [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.
  }

Мы подумали, что используем resource_bundles неправильно, поэтому снова поискали в Google. Удивительно, но использование resource_bundles вместо resources рекомендуется в официальной документации. Кроме того, мы не смогли найти ненадлежащее использование с точки зрения resource_bundles, что оставило нас без вариантов.

Кто-нибудь может помочь? Я подумал, может быть, мы могли бы исправить Y.xcworkspace в скрипте post_install в Podfile, но я не знаю, как это сделать.


person Houston Duane    schedule 19.11.2019    source источник
comment
может быть связано с github.com/CocoaPods/CocoaPods/issues/8431   -  person Paul Beusterien    schedule 20.11.2019
comment
К сожалению, ни одно из решений, предложенных в вашей ссылке, не помогло решить мою проблему. Спасибо, в любом случае!   -  person Houston Duane    schedule 20.11.2019


Ответы (3)


Я решил эту проблему, написав скрипт 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

Похоже, это ошибка CocoaPods, которая до сих пор не исправлена.

person Houston Duane    schedule 20.11.2019
comment
Получил undefined method 'include'? for nil:NilClass за build_phase.output_paths.include? - person Rickard Elimää; 16.12.2019
comment
Возможно, вам придется добавить require 'xcodeproj' в начало вашего подфайла. - person Houston Duane; 17.12.2019
comment
Спасибо за ответ и разъяснение. На самом деле я решил это, просто запустив pod update. Проблема, вероятно, заключалась в более старой версии одного из многих фреймворков, которые мы используем. - person Rickard Elimää; 17.12.2019

Эта проблема возникает по-разному; некоторым нравится описанная выше проблема, а в других случаях — наличие расширения общего доступа или приложения Watch в дополнение к приложению iOS. Во всех сценариях это вызвано наличием нескольких Assets.car выходов в [CP] Copy Pods Resources тех целей, которые создают дубликаты Assets.car файлов. Компилятор, очевидно, не знает, как с этим справиться, поэтому мы не должны позволять CocoaPods генерировать несколько выходных файлов с одним и тем же именем.

Рекомендуемое решение для проблемы с CocoaPods — поместить это в 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.

person iwasrobbed    schedule 26.08.2020

Прошел почти месяц и вот обновление. Оказалось, что эта проблема была вызвана неправильным использованием другого модуля разработки Y. Мы забыли использовать resource_bundles в Podspec этого модуля разработки, что привело к тому, что ресурсы этого модуля разработки НЕ были упакованы в файл .bundle, после чего [CP] Copy Pods Resources явно добавил xcassets во входные файлы, столкнувшись с другим в Copy Bundle Resources .

person Houston Duane    schedule 17.12.2019
comment
привет, используя resouce_bundles, я не могу получить ресурсы изображения с помощью Xcode 12.5. Всегда есть Assets.carin Pod.bundle, не удается получить ресурсы изображения - person Lê Khánh Vinh; 01.06.2021