"Нет такого модуля", когда я использую CocoaPods
Итак, вот моя процедура. Я создаю новый Podfile
в каталоге проекта, затем я добавил следующее
platform :ios, '9.0'
use_frameworks!
target 'CPod' do
pod 'AFNetworking', '~> 2.5'
pod 'ORStackView', '~> 2.0'
pod 'SwiftyJSON', '~> 2.1'
end
Я стреляю pod install
и все идет хорошо, откройте xcworkspace
, Затем я иду к ViewController.swift
и если я пытаюсь импортировать стручок, я получаю No such module 'SwiftyJSON'
если бы я должен был сделать import SwiftyJSON
, Есть идеи?
РЕДАКТИРОВАТЬ: SwiftyJSON является модулем на основе Swift, а не Obj-C
29 ответов
Попробуйте добавить Pods
фреймворк для вашей схемы сборки и построения фреймворка. После того, как вы его построите, соберите / запустите ваш проект.
шаги:
- Меню Схема> Управление схемами> проверка
Pods
> Закрыть ( изображение 1, изображение 2) - Выбрать
Pods
из меню схемы. - строить
Pods
, - Выберите ваш проект из того же меню, затем соберите / запустите его.
Вы должны снова открыть файл проекта.xcworkspace (не.xcodeproj) после установки вашего подфайла.
- Клонировать репо с CocoaPods
- Откройте YourWorkspace/YourApplication.xcworkspace
- Выберите приложение, которое хотите запустить, добавив SwiftyJSON.framework во встроенные двоичные файлы для этого проекта. Нажмите Run.
Удачного кодирования:)
Вы также можете попробовать переустановить модули, используя:
pod deintegrate
а потом
pod install
Это исправило эту проблему для меня
Нажмите Ctrl +Option+Shift+K, а затем Запустите ваше приложение, вы увидите магию.
Или из меню -> Product, нажмите Option на клавиатуре, и вы увидите Clean Build Folder.
Забавно, что, как Xcode может делать такие вещи с нами, но со мной произошло то же самое, когда я использовал библиотеку Swift с помощью Pod, и после слишком большой борьбы я в итоге выбрал Clean Build Folder.
Не уверен, что это все еще будет полезно для других. Но в моем случае это оказалось глупой ошибкой не ссылаться на зависимости из файла.podspec.
У нас есть приложение с несколькими внутренними библиотеками, и эти библиотеки также имеют зависимости друг от друга - что мы учитывали в Podfiles... но НЕ в podspecs.
Итак, хотя наши подфайлы имели:
Приложение / Подфайл
# Development Pods
pod 'ConsumingLibrary ', :path => '../ios-consuming-lib'
pod 'DependentLibrary1', :path => '../ios-library-one'
pod 'CommonCoreLibrary', :path => '../ios-common-core-lib'
ConsumingLibrary / Podfile
# Development Pods
pod 'DependentLibrary1', :path => '../ios-library-one'
pod 'CommonCoreLibrary', :path => '../ios-common-core-lib'
Необходимо также вызвать это в.podspec's:
ConsumingLibrary / ConsumingLibrary.podspec
# TODO
# Add here any resources to be exported.
s.dependency 'DependentLibrary1', '~> 0.1.0-RC'
DependentLibrary1 / DependentLibrary1.podspec
# TODO
# Add here any resources to be exported.
s.dependency 'CommonCoreLibrary', '~> 0.1.0-RC'
Я думаю, что я потратил около 2 часов, пытаясь выяснить, почему я мог создать ConsumingLibrary и запустить тесты, но как только я создал приложение, которое потребляло все три библиотеки - я продолжал получать:
Нет такого модуля 'DependentLibrary1'
В моем случае это было потому, что я открыл
xcodeproj
вместо правильного
xcworkspace
.
Была и эта проблема. Я заметил папку вPods/broken_framework_name
для фреймворка, который выдал ошибку, был пуст даже после установки модуля или обновления модуля. Итак, мне помогли эти шаги:
- близко
XCode
полностью - удалять
DerivedData
- удалять
Podfile.lock
- бегать
pod deintegrate
- удалять
.xcworkspace
файл - возможно необязательный шаг: у меня была генеральная линия
use_frameworks!
написано перед всеми целями, но включил его также в цель, в которой у меня была ошибка - бегать
pod install
После всех шагов я заметил, что отсутствующие файлы фреймворка наконец-то вернулись, и сборка снова заработала.
Попробуйте использовать pod update после команды pod install, что решит проблему отсутствия такого модуля. Я только что попробовал, и это работает нормально.
Спасибо, Ратнешвар
Тем, кто работает с несколькими целями, не забудьте добавить эту строку в поды.
def shared_pods
pod 'SSKeychain', '~> 0.1.4'
pod 'INAppStoreWindow', :head
pod 'AFNetworking', '1.1.0'
pod 'Reachability', '~> 3.1.0'
pod 'KSADNTwitterFormatter', '~> 0.1.0'
pod 'MASShortcut', '~> 1.1'
pod 'MagicalRecord', '2.1'
pod 'MASPreferences', '~> 1.0'
end
target 'Target_Name' do
shared_pods
end
target 'Target_Name_Two' do
shared_pods
end
Иногда происходит, когда у вас есть модуль obj-c в быстром проекте (даже когда вы используете use_frameworks!
в .podfile
).
Если вы уверены, что модуль установлен и у вас все еще нет такого модуля, попробуйте это:
- Перейти к проекту Pods в Xcode
- Бобы
- Щелкните правой кнопкой мыши на пострадавшем модуле
- Показать в поисковике
Должен быть файл пакета с суффиксом .framework. Создайте в нем папку Modules. В этой папке создайте файл с именем module.modulemap с кодом:
framework module MODULE_NAME_HERE {
umbrella header "MODULE_NAME_HERE.h"
export *
module * { export * }
link framework LINKED_FRAMEWORKS_AND_LIBRARIES_THE_POD_NEEDS_HERE
link framework "AdSupport"
link "c++"
link "z"
}
Восстановите, и вы должны быть в порядке.
Как писал @jakub-truhlář, основной проблемой является отсутствующий файл module.modulemap из-за некоторой проблемы параллелизма, связанной со смешиванием библиотек Swift и Objective-C, но вместо того, чтобы создавать эти файлы вручную, было бы лучше несколько раз очистить производные данные и построить свой проект. Когда проект будет успешно собран, передайте файлы module.modulemap в свой репозиторий, чтобы избежать потери этих файлов, например, при изменении текущей ветви.
я исправил это, установив флажок «Найти неявные зависимости» на true. Перейдите в «Редактировать схему» -> вкладка «Сборка» -> установите «Найти неявные зависимости» = true.
и восстановить.
Для меня удаление следующего из моего
installer.pods_project.build_configurations.each do |config|
config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
end
Я столкнулся с той же проблемой в быстрой среде, которую я разработал. У фреймворка была зависимость от git project, и сам фреймворк был добавлен в качестве модуля в мой основной проект. Таким образом, в идеале зависимость должна быть указана в файле podspec и Podfile.
Я не сталкивался с проблемой при доступе через мой основной проект, но при открытии автономного фреймворка выдает ошибку "Нет такого модуля".
Основная причина заключается в том, что базовые конфигурации задаются путем, который указывает на мой основной проект, а не на сам фреймворк, потому что я сначала запускал podinstall в своем основном проекте, а затем в проекте фреймворка.
Например: в файле проекта это было похоже на 0091AB0C861D71C94ADD7240 / * Pods-myframework.release.xcconfig * / = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-myframework.release.xcconfig"; path = "../../Apps/MyMainProject/Pods/Target Support Files / Pods-myframework / Pods-myframework.release.xcconfig"; sourceTree = ""; };
После выполнения указанного ниже исправления, 4444F5B1B35F066E57F96782 / * Pods-myframework.release.xcconfig * / = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-myframework.release.xcconfig"; path = "Pods / Целевые файлы поддержки / Pods-myframework / Pods-myframework.release.xcconfig"; sourceTree = ""; };
Чтобы исправить ошибку,
- Файл проекта -> Конфигурации -> Установите для всех конфигураций значение none.
- Удалить папку Pods и Podfile.lock.
- Сначала запустите 'pod install' в директории проекта фреймворка, а затем выполните установку pod в главном каталоге проекта.
Другой способ проявления этой проблемы: если у вас есть несколько целей с разными платформами (например, iOS и watchOS), вам необходимо убедиться, что ваш подфайл указывает правильную платформу для каждой цели. В противном случае Cocoapods может строить правильный модуль, но для неправильной платформы, что приведет к ошибке «Нет такого модуля».
Вы можете исправить это, просто указав правильные платформы, например
# global platform
platform :ios, '11.0'
target 'My Framework' do
use_frameworks!
pod 'RxSwift', '~> 5.1'
end
target 'My Framework (watchOS)' do
# override global platform for this target
platform :watchos, '4.0'
use_frameworks!
pod 'RxSwift', '~> 5.1'
end
Я только что обновил определенные зависимости в терминале
Перейдите в папку проекта и выполните команду ниже
pod обновить имя вашего pod
Для меня мне нужно сделать
обновление пакета ReachabilitySwift
Я получаю предупреждение при установке модуля: '... target отменяет FRAMEWORK_SEARCH_PATHS
настройка сборки определена в...'.
Исправьте и наслаждайтесь.
Ссылка: цель переопределяет настройки сборки FRAMEWORK_SEARCH_PATHS.
Добавление ссылки "C++" в фреймворк module.modulemap работает у меня
У меня была эта проблема, когда я открыл XCode, а затем выбрал рабочую область своего проекта через file->open недавний.
Я обнаружил, что в моей файловой системе было два файла.xcworkspace для одной рабочей области / проекта.
Открытие XCode двойным щелчком по правильному файлу.xcworkspace помогло. Правильный - тот, который работает.
Я позже удалил не тот.
Обязательно импортируйте правильное имя фреймворка, которое определено в .podspec
капсулы.
Я обычно удаляю Pods
папка и .xcworkspace
файл, затем я бегу pod install
снова, и это помогает почти в 100% случаев.
Моя установка
- macOS 10.14 Mojave
- Xcode 10.3
- кокосы 1.7.5
Ни один из ответов не работает для меня, хотя некоторые дают частичные подсказки. В моем случае основная причина заключалась в том, что я настроил пути к продукту сборки после запускаpod install
.
Если вы запускаете cocoapods сразу после создания проекта Xcode, он обычно работает, если вы открываете сгенерированный Xcode .xcworkspace
вместо .xcodeproj
.
Забавные вещи случаются, если вы начинаете настраивать пути продукта сборки после создания рабочей области. Поскольку сгенерированный проект Pods и его цель относятся к настройкам вашего старого проекта Xcode.
В моем случае моя проблема возникла из-за:
- Я предпочитаю, чтобы все мои продукты сборки находились в папке проекта
$(SRCROOT)/build/$(CONFIGURATION)/$(EFFECTIVE_PLATORM_NAME)
. Я пошел дальше и изменилPre-configuration Build Products Path
к нему.... ПОСЛЕ выполненияpod install
.
Теперь сгенерированный Pods
проект, включая всю его цель Framework, по-прежнему указывает на старое местоположение, поэтому как импорт заголовка, так и связывание вашего собственного проекта не удастся (вы увидите Command PhaseScriptExecution failed with a nonzero exit code
когда No such module
фиксированный).
Исправление:
- Удалите все элементы Pods, включая рабочую область.
- Регенерировать
Pods
проект и рабочее пространство сpod install
. Однако cocoapods жестко запрограммировали путь продукта сборки к${SRCROOT}/../build
а такжеPre-configuration Build Products
к$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
в моем случае, что обычно указывает на временный~/Library/Developer
подпапка. Все еще не совсем так. Затем.... - Убедитесь, что
Framework Search Path
а такжеHeader Search Path
моего собственного проекта охватывают указанные выше пути. - Твик
Pods
настройки проекта и все структуры зависимостейPre-configuration Build Products Path
использовать мои предпочтительные пути.
Моральный урок: всегда регенерируйте модули и проверяйте ключевые пути результатов всякий раз, когда вы касаетесь путей в настройках проекта Xcode.
ОБНОВИТЬ
В Xcode 11 Apple наконец-то удалила запутанный "Путь к продуктам для предварительной конфигурации". Чтобы настроить пути продукта сборки, используйтеLocations
в настройках Xcode с предварительно запеченными глобальными относительными путями.
Возникла эта проблема при добавлении CocoaPods в старый проект, который ранее уже включал библиотеки libs. Это произошло потому, что Xcode не разрешал Framework Search Path
генерируется CocoaPods из-за значений, ранее установленных в настройках цели.
Решение, которое помогло мне:
скопировать старый путь
нажмите удалить, чтобы полностью очистить
Framework Search Path
настройки в столбце цели - там появится путь, сгенерированный CocoaPodsдобавить старый путь поиска обратно к сгенерированному (необходим только в том случае, если у вас еще есть несколько фреймворков, добавленных вручную, для работы)
Очистить проект, стереть производные данные, собрать.
Результат будет выглядеть следующим образом (1-я строка добавлена Xcode, 2-я добавлена CocoaPods, а 3-я - вручную):
В случае нескольких целей. Например, Цель 1, Цель 2
use_frameworks!
target 'Target1' do
pod 'Fabric'
pod 'Crashlytics'
target 'Target2' do
end
end
Затем запустите pod install.
Если вы видите это предупреждение:
[!] The `Joint [Debug]` target overrides the `FRAMEWORK_SEARCH_PATHS` build setting defined in `Pods/Target Support Files/Pods-Joint/Pods-Joint.debug.xcconfig'. This can lead to problems with the CocoaPods installation
- Use the `$(inherited)` flag, or
- Remove the build settings from the target.
[!] The `Joint [Release]` target overrides the `FRAMEWORK_SEARCH_PATHS` build setting defined in `Pods/Target Support Files/Pods-Joint/Pods-Joint.release.xcconfig'. This can lead to problems with the CocoaPods installation
- Use the `$(inherited)` flag, or
- Remove the build settings from the target.
следуйте инструкциям, чтобы избежать
Module not found
проблема.
Я перепробовал все эти предложения, но у меня ничего не получалось. Вместо этого, то, что работало для меня, было дезинтеграцией стручков. Затем удалите папку pods из иерархии xcode и выполните установку pod. Внезапно это сработало. Не спрашивайте меня, почему, потому что в любом случае большинство из этих предложений в любом случае попало или пропустили, но я буду рад, если это будет работать и для кого-то еще:)
Вы не можете собрать для macOS, если у вас есть
Вы можете попробовать изменить целевое устройство в Xcode (раскрывающееся меню схемы).
В моем случае мой Podfile специально ограничил платформу iOS, используя
platform :ios, ‘9.0’
, но я создавал приложение для macOS. Я знаю, это глупо, но я на время застрял .
Вам следует удалить эту строку, если ваш проект поддерживает macOS, или прекратить сборку / поддержку macOS.
Для использования Swift в Objective-C вы должны импортировать файл заголовка, который Xcode генерирует автоматически во время компиляции (NameOfModule+Swift.h). В этом случае вам следует попробовать импортировать SwifityJSON в заголовочный файл, например так:
#import "SwiftyJSON-Swift.h"