CocoaPods добавляет дублирующий проект в xcworkspace
Моя структура рабочей области следующая:
-ProjectA
--ProjectB
--ProjectC
-Pods
Я запускаю 'pod update', и то, что я получаю,
-ProjectA
--ProjectB
--ProjectC
-Pods
-ProjectB < - этого не должно быть здесь!
Мой подфайл:
platform :ios, '7.0'
inhibit_all_warnings!
workspace 'ProjectA'
target :ProjectA do
pod "AFNetworking", "~> 2.0"
pod 'Facebook-iOS-SDK'
pod 'SDWebImage'
pod 'FXBlurView'
pod 'RESideMenu'
pod 'RBStoryboardLink'
end
target :ProjectBTests do
xcodeproj 'Libraries/ProjectB/ProjectB'
pod 'Expecta'
pod 'Specta'
pod 'OCMock'
end
Так можно ли что-либо сделать с таким поведением?
Спасибо!
Ответы
Ответ 1
Пожалуйста, зарегистрируйте его как ошибку в coocoapods.
Сгенерированный файл xcworkspace неверен.
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:ProjectA.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
<FileRef
location = "group:ProjectA/ProjectB/ProjectB.xcodeproj">
</FileRef>
</Workspace>
Ответ 2
Заменил эту строку в lib/cocoapods/installer/user_project_integrator.rb
#create_workspace
:
new_file_references = file_references - workspace.file_references
с этим кодом вместо этого:
new_file_references = file_references - workspace.file_references
absolute_paths = workspace.file_references.map { |fr| fr.absolute_path(workspace_path) }
new_file_references = new_file_references.select { |fr| absolute_paths.include? fr.absolute_path(workspace_path) }
В основном используйте абсолютный путь для фильтрации элементов, которые уже были добавлены в рабочую область.
Ответ 3
TL;DR: это ошибка рабочей области пользователя. Чтобы решить эту проблему, просто откройте свое рабочее пространство contents.xcworkspacedata
в текстовом редакторе и упростите все относительные пути. Например, OMGNotExistingDirectory/../FirstLibrary/FirstLibrary.xcodeproj
теперь должен выглядеть как FirstLibrary/FirstLibrary.xcodeproj
Таким образом, иногда при перестройке ваших проектов в рабочей области ваш файл contents.xcworkspacedata
может выглядеть так:
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:App/App.xcodeproj">
</FileRef>
<FileRef
location = "group:OMGNotExistingDirectory/../FirstLibrary/FirstLibrary.xcodeproj">
</FileRef>
<FileRef
location = "group:SecondLibrary/SecondLibrary.xcodeproj">
</FileRef>
<FileRef
location = "group:ThirdLibrary/ThirdLibrary.xcodeproj">
</FileRef>
</Workspace>
Видите, что OMGNotExistingDirectory/../FirstLibrary/FirstLibrary.xcodeproj
? Да, в этом проблема. Даже если папка в пути больше не существует, часть пути /..
позволяет XCode игнорировать ее и работать без проблем.
Теперь мы запускаем pod install
. Проблема здесь в том, что когда CocoaPods повторно собирает рабочее пространство, он сравнивает относительные пути вместо абсолютных, чтобы избежать дублирования. И, разумеется, FirstLibrary/FirstLibrary.xcodeproj
не является OMGNotExistingDirectory/../FirstLibrary/FirstLibrary.xcodeproj
даже если они указывают на один и тот же файл.
Таким образом, чтобы решить эту проблему, вы должны упростить относительные пути в вашем рабочем пространстве, удалив лишние части в них.
Спасибо kezi за ответ на вопрос, в чем проблема.