Ответ 1
Решением для меня было обновление cocoapods до версии 1.1.0.rc.2.
sudo gem install cocoapods --pre
Я уже несколько дней стучаю головой о стену, но, несмотря на несколько поисков Google/SO/Github, я не могу найти решение проблем, которые у меня есть.
Все, что я пытаюсь сделать, это создать некоторые модульные тесты для моего приложения, в которых используются модули Firebase.
Я использую Xcode 7.3.1 и Cocoapods 1.0.1. Обновление: Проблема остается с Xcode 8.0
С этим podfile:
platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!
target 'MyApp' do
pod 'Firebase'
pod 'Firebase/Auth'
pod 'Firebase/Database'
pod 'Firebase/Storage'
target 'MyAppTests' do
inherit! :search_paths
end
end
В моем классе XCTest я получаю
Отсутствует необходимый модуль "Firebase"
ошибка при @testable import MyApp
В качестве альтернативы с этим podfile:
platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!
def common_pods
pod 'SwiftyTimer'
pod 'Firebase'
pod 'Firebase/Auth'
pod 'Firebase/Database'
pod 'Firebase/Storage'
end
target 'MyApp' do
common_pods
end
target 'MyAppTests' do
common_pods
end
Тесты строятся, но моя консоль усеяна предупреждениями, например:
Класс < -FirebaseClassName- > реализуется как в... MyApp... и... MyAppTests... Один из двух будет использоваться. Какой из них undefined
Решением для меня было обновление cocoapods до версии 1.1.0.rc.2.
sudo gem install cocoapods --pre
У меня была такая же проблема. Я решил это, переместив pod 'Firebase'
в свою тестовую цель. Измените свой подфайл:
platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!
target 'MyApp' do
pod 'Firebase/Auth'
pod 'Firebase/Database'
pod 'Firebase/Storage'
target 'MyAppTests' do
inherit! :search_paths
pod 'Firebase'
end
end
Попробуйте изменить наследование на :complete
, как в:
target 'MyAppTests' do
inherit! :complete
end
Важно, чтобы кто-то еще проверил ваше репо, просто выполнив pod update
, как обычно, без необходимости копировать файлы .xcconfig
или другие хакеры только для сборки.
Проблема заключается в том, что Firebase делает что-то особенное с путями поиска заголовков после того, как CocoaPods генерирует собственное значение для параметра, поэтому CocoaPods не подбирает это изменение, чтобы переносить его на тестовый объект. Вы можете решить этот один из двух способов:
Найдите MyAppTests.<configuration>.xcconfig
в навигаторе файлов и добавьте следующее в HEADER_SEARCH_PATHS
:
${PODS_ROOT}/Firebase/Analytics/Sources
[*]
Найдите настройки для Пути поиска заголовков в настройках сборки и добавьте то же значение, что и в опции 1 к списку. Вам не нужно устанавливать его как рекурсивный.
* В соответствии с комментарием AKM это изменилось на ${PODS_ROOT}/Firebase/Core/Sources
в версии 3.14.0
Проблема записана в проекте firebase здесь:
https://github.com/firebase/firebase-ios-sdk/issues/58
Существует обходное решение:
Добавьте "$ {PODS_ROOT}/Firebase/Core/Sources" в целевую аудиторию только в настройках сборки → Пути поиска заголовков
но это также исправлено путем обновления до CocoaPods 1.4.0 или более поздней версии, что является лучшим решением.
В то время, когда я пишу это (ноябрь 2017 года), cocoapods 1.4.0 все еще находится в стадии бета-тестирования, поэтому для его установки вам необходимо явно запросить бета-версию:
gem install cocoapods --pre
Это, а затем выполнение pod install
решило проблему с запуском моих тестов.
Три шага, прежде чем я смогу заставить это работать:
CocoaPods: 1.5.0 Swift 4 Firebase: 4.13.0
Шаг 1. Обязательно добавьте следующий целевой блок в ваш файл.
# Uncomment the next line to define a global platform for your project
platform :ios, '11.3'
target 'TIMII' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!
# Pods for TIMII
pod 'Firebase/Core'
pod 'Firebase/Database'
pod 'Firebase/Auth'
pod 'Firebase/Storage'
target 'TIMIITests' do
inherit! :search_paths
pod 'Firebase/Core'
end
end
Шаг 2: На вкладке "Настроить вкладку" Настроить проект "на вкладке" Навигатор проекта ". Найдите строку пути поиска заголовка и добавьте в Debug следующую строку
$ (унаследованный) $ {PODS_ROOT}/Firebase/Core/Sources
Шаг 3: В терминальном запуске:
обновление pod
Я попробовал все вышеперечисленное и столкнулся с различными ошибками, первоначально начиная с Missing required module 'Firebase'
, затем получая "Class ... is implemented in both ... "
или проблемы с компоновщиком, если я пытался добавить модули Firebase в свою цель тестирования.
Решение, которое сработало для меня, заключалось в следующем:
$(inherited) non-recursive
$(SRCROOT)/Pods/Headers/Public recursive
$(SRCROOT)/Pods/Firebase recursive
На этом этапе очистка папки сборки, повторная сборка и повторный запуск тестов помогли мне. Надеюсь, это поможет кому-то!
У меня была аналогичная проблема. Ссылаясь на ваш вопрос, я скопировал содержимое моего файла MyApp.<configuration>.xcconfig
в мой файл MyAppTests.<configuration>.xcconfig
. Я очистил и построил тесты, и это сработало.
Добавить "$ {PODS_ROOT}/Firebase/Core/Sources" в целевую аудиторию только в Настройки сборки → Контуры поиска заголовков
Как @Вы упомянули проблему вокруг путей поиска заголовков после установки CocoaPods.
У меня есть проект с несколькими целями, где pod "Firebase" встроен в отдельный модуль, скажем, MyProject-Shared
. Firebase pod в 'Podfile' установлен только для цели MyProject-Shared. Другие модули, которые хотят использовать "MyProject-Shared", не могут быть скомпилированы из-за ошибки:
"отсутствует требуемый модуль" Firebase "'
Трюк в моем случае состоял в том, чтобы добавить следующий отсутствующий путь поиска заголовка в каждой целевой настройке Build Settings, ссылаясь на Google Analytics-Framework:
"${PODS_ROOT}/Firebase/CoreOnly/Sources"
Надеюсь, это сэкономит ваше время.
Добавление ${SRCROOT}/Pods/Firebase/CoreOnly/Sources
в цель модульного теста "Пути поиска заголовка" устранило проблему.
Этапы:
После этого тесты могут быть запущены, и ошибка исчезнет.
Missing required module Firebase
НЕТ раствора CocoaPodsДля тех, кто сталкивается с той же проблемой, но НЕ использует CocoaPods:
Если вы используете Firebase, у вас есть папка, содержащая файлы Firebase.h
и module.modulemap
. Например - YOUR_PROJECT_DIR/Linking
Если цель вашего основного проекта работает правильно, то вам следует перейти к ProjectSettings → Targets. Выберите цель теста. Найдите User headers
и добавьте путь к YOUR_PROJECT_DIR/Linking
. Выберите опцию recursive
и вам будет хорошо идти.
Смотрите скриншот для более подробной информации: