Cocoapods: определение двойного интерфейса
Я обернул свою частную библиотеку в cocoapods. Он имеет зависимость от ReactiveCocoa.
s.name = 'MineLibrary'
s.dependency 'ReactiveCocoa/Core'
s.source_files = 'Source/*.{h,m,swift}'
....
Некоторые файлы заголовков содержат:
#import <ReactiveCocoa/RACSignal.h>
Я включаю его в новый проект:
use_frameworks!
....
pod 'ReactiveCocoa'
pod 'MineLibrary', :git => '[email protected]'
Но когда я скомпилирую проект, я получаю сообщение об ошибке:
duplicate interface definition for class 'RACStream'
duplicate interface definition for class 'RACSignal'
/Users/USER/Library/Developer/Xcode/DerivedData/Project-emcwpmbbuimotuftzijeemvngrvj/Build/Products/Debug-iphoneos/Pods/ReactiveCocoa.framework/Headers/RACStream.h:27:1: error: duplicate interface definition for class 'RACStream'
@interface RACStream : NSObject
^
/Users/USER/Workspace/Project/Pods/ReactiveCocoa/ReactiveCocoa/RACStream.h:27:12: note: previous definition is here
@interface RACStream : NSObject
Как это можно решить?
Постскриптум Я использую cocoapods 0.36.0.rc.1
Ответы
Ответ 1
Вы пробовали обновление до последней версии CocoaPods? Я заметил, что вы упомянули, что используете устаревший кандидат на выпуск, который, возможно, виноват здесь.
В общем, вот что вам нужно делать при создании и использовании CocoaPod в вашем приложении:
1) В CocoaPod объявите все ваши зависимости в спецификации pod, используя s.dependency
для каждого
2) В вашем приложении используйте CocoaPods для управления всеми зависимостями вашего приложения. То есть, не вручную перетаскивайте библиотеки в ваше приложение. Если вы это сделаете, вы рискуете создать дубликаты классов с теми, которые вы перетаскиваете и включаете.
3) Как в вашем приложении, так и в CocoaPod, зависит от вас как гибких версий. В общем, вы должны, по крайней мере, разрешить небольшие обновления версий, например. pod 'PodName', '~> 1.0.0'
.
4) В вашем файле pod app укажите цель для вашего приложения и вашего целевого объекта unit test, например.
target "MyApp" do
# App pods...
end
target "MyAppTests", :exclusive => true do
# Test pods...
end
Если у вас более двух целей, укажите цель для каждого. Или, по крайней мере, укажите другую цель для модульных тестов, в результате чего приложение будет введено в нее.
Ответ 2
У меня была эта проблема некоторое время назад, кто-то импортировал заголовок cocoapod неправильно. Убедитесь, что вы используете скобку, E.G. скорее, чем:
#import "theUsefulClass.h"
вы должны использовать:
#import <thePod/theUsefulClass.h>
Ответ 3
В Xcode вы можете проверить Symbol Navigator (Cmd-3), чтобы увидеть, где символ определяется дважды. Это позволит вам принять решение о том, что делать. В моем случае я нашел два символа с одинаковыми именами в двух разных библиотеках. Возможно, к одному из них может быть добавлен префикс к имени символа, чтобы устранить неоднозначность конфликта.