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 за ответ на вопрос, в чем проблема.