2013-05-28 4 views
16

У меня есть рабочее пространство, которое содержит:Использование CocoaPods с несколькими проектами

  • myiPhone.xcodeproj
  • sharedStuff/sharedStuff.xcodeproj

sharedStuff.xcodeproj создает статическую библиотеку, которая является зависимость к myiPhone.xcodeproj (для простоты предполагаем, что каждый проект имеет одну цель).

Теперь я хочу добавить библиотеку через CocoaPods, которые должны быть доступны обоим проектам.

Мой Podsfile выглядит следующим образом:

workspace 'myWorkspace.xcworkspace' 
platform :ios 

target :myiPhone do 
    xcodeproj 'myiPhone.xcodeproj' 
    pod 'MBProgressHUD', '~> 0.6' 
end 


target :sharedStuff do 
    xcodeproj 'sharedStuff/sharedStuff.xcodeproj' 
    pod 'MBProgressHUD', '~> 0.6' 
end 

Когда я строю я получаю эти ошибки:

diff: /../Podfile.lock: No such file or directory diff: /Manifest.lock: No such file or directory error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.

Любой имеют понятия, что здесь происходит?

ОБНОВЛЕНИЕ: С его внешностью переменная PODS_ROOT не установлена, когда выполняется фаза сборки Check Checks Manifest.lock.

+0

У меня такая же проблема. Решение этого было бы неплохо! – fatuhoku

ответ

8

Первые цели в ваших проектах xcode имеют фазу сборки для выполнения diff для двух файлов блокировки. Но похоже, что ваши конфигурации проектов xcode не ссылаются на пользовательские настройки, настроенные в Pods/Pods-libPods.xcconfig.

Похоже, вы пытаетесь связать Pod с конкретными целями в нескольких xcodeprojs. Если мое предположение верно, вы неправильно используете атрибут target. Атрибут target создает новую статическую библиотеку в проекте Pods, который включает в себя Pods, которые вы настроили в пределах этого target.

Целью по умолчанию для Pods xcodeproj является libPods, которая генерирует статическую библиотеку libPods.a. Это генерируется, если вы не укажете target. Поэтому, если вам не нужно создавать несколько статических библиотек в Pods xcodeproj, не мешайте определять цель и используйте атрибут link_with, чтобы связать стандартные libPods target (статическую библиотеку) с целями в ваших xcodeprojs.

Например, следующий Podfile создаст цель libPods в Pods.xcodeproj который добавит источники MBProgressHUD на этапе компиляции затем добавить файл xcconfig определения PODS_ROOT и PODS_HEADER_SEARCH_PATH, например, для каждого из ваших xcodeprojs. Он будет затем связать эту статическую библиотеку для целей, которые вы указали при link_with и xcodeproj

workspace 'myWorkspace.xcworkspace' 
platform :ios 

xcodeproj 'myiPhone.xcodeproj' 
link_with 'myiPhone' 
xcodeproj 'sharedStuff/sharedStuff.xcodeproj' 
link_with 'sharedStuff' 

pod 'MBProgressHUD', '~> 0.6' 
+0

Вы правы насчет цели против link_with. Кажется, фаза сборки, которая проверяет, что Podfile.lock не обновляется правильно, поэтому мне пришлось удалить ее вручную и выполнить установку pod. Также я понял, что неправильно связывать стручок с моей основной мишенью и с целью, которая создает статическую библиотеку, которая связана с моей главной целью, поскольку она вызывает дубликаты символов. Это имеет смысл, хотя и не является проблемой CocoaPods. –

+1

@MihaiDamian Что вы делали в отношении дубликатов символов. В конечном итоге вы хотите, чтобы библиотека библиотеки привязывалась только к основной целевой теме приложения, а не к статической lib. – Wilmar

+4

Это не работает для меня. Выполняется только последнее заявление 'link_with'. Таким образом, в приведенном выше примере единственной целью, связанной с 'Pods.a', будет« sharedStuff ». – bcattle

17

У меня есть 2 проектов в моей рабочей области и приняли решение не работает для меня. Но, наконец, я справился с тем, как правильно использовать Cocoapods с двумя проектами.Вот как мой файл стручок выглядит следующим образом:

workspace 'Projects.xcworkspace' 
platform :ios, '8.0' 

use_frameworks! 

# ignore all warnings from all pods 
inhibit_all_warnings! 

def shared_pods 
    # all the pods go here 
    # pod 'Parse' etc. 
end 

xcodeproj 'Project1.xcodeproj' 
xcodeproj 'Project2/Project2.xcodeproj' 

target :Project1 do 
    xcodeproj 'Project1' 
    shared_pods 
end 

target :Project2 do 
    xcodeproj 'Project2/Project2.xcodeproj' 
    shared_pods 
end 
+0

Если ваш проект 2 является зависимостью для проекта 1, не приведет ли это к дублированию символов? – Daniel

+0

Нет. Почему это может вызвать дублирование символов? –

+1

Я получаю ошибку компоновщика –

2

Это моя структура

OB 
|podfile 
|Project1->Project1.xcodeproj 
|Project2->Project2.xcodeproj 

папку, и это мой podfile внутри OB Папка

source 'https://github.com/CocoaPods/Specs.git' 
platform :ios, '8.0' 

workspace 'OB.xcworkspace' 
use_frameworks! 

# ignore all warnings from all pods 
inhibit_all_warnings! 

project 'Project1/Project1.xcodeproj' 
project 'Project2/Project2.xcodeproj' 

abstract_target 'OB' do 
    pod 'Alamofire', '~> 4.0' 

    target 'Project1' do 
     project 'Project1/Project1.xcodeproj' 
    end 

    target 'SchoolKids' do 
     project 'Project2/Project2.xcodeproj' 
    end 
end 

Это добавит Afnetworking/Alamofire для обоих проектов. Если нам нужен эксклюзивный блок для конкретного проекта, мы можем это сделать

target 'Project1' do 
     project 'Project1/Project1.xcodeproj' 
     pod 'Alamofire', '~> 4.0' 
    end