2013-03-27 11 views
3

Я разработал проект iOS, который представляет собой библиотеку классов, имеющую дело с разными серверами. Для каждого приложения, в котором используется библиотека, требуется только один сервер. Тип сервера настраивается с помощью определения препроцессора во время компиляции.Как определить отдельные параметры xcconfig в подпрограммах Cocoapod?

В podspec моей библиотеке, я определил различные subspecs для каждого сервера, как это:

s.name = "ServerLib" 
[...] 
s.subspec 'ServerA' do |a| 
    a.source_files = 'Classes/A/**/*.{h,m}' 
    a.xcconfig = { "GCC_PREPROCESSOR_DEFINITIONS" => "$(inherited) ServerA=1" } 
end 

s.subspec 'ServerB' do |b| 
    b.source_files = 'Classes/B/**/*.{h,m}' 
    b.xcconfig = { "GCC_PREPROCESSOR_DEFINITIONS" => "$(inherited) ServerB=1" } 
end 

Мое приложение является приложением нескольких клиентов с одной цели на одного клиента. Каждый клиент использует конкретный сервер из проекта библиотеки. Итак, мой Podfile выглядит следующим образом:

platform :ios, '5.0' 

pod 'MyCore' 
pod '3rdPartyLib' 

target :'Customer1', :exclusive => true do 
    pod 'ServerLib/ServerA' 
end 

target :'Customer2', :exclusive => true do 
    pod 'ServerLib/ServerB' 
end 

Что pod install скрипт делает, это объединение всех флагов, определенных в subspecs в одно значение в каждом стручка-customerN.xcconfig файл

GCC_PREPROCESSOR_DEFINITIONS = $(inherited) 3RD_PARTY_FLAGS $(inherited) ServerA=1 $(inherited) ServerB=1 

Любые предложения, как чтобы обойти это неправильное (?) поведение Кокоаподов? Насколько я понимаю документацию, свойства subspec должны унаследовать только от его родительских спецификаций, а не подпрограмм одного уровня.

+0

Вы когда-нибудь находили решение этого вопроса? – epologee

ответ

2

Нал обходной путь, может быть, не то, что элегантный:

С pod install сливает все флаги компилятора в один, я должен был удалить GCC_PREPROCESSOR_DEFINITIONS из podspec файла библиотеки. Но без этого определения моя библиотека не строится.

В Xcode это можно легко устранить, добавив определение к цели каждой библиотеки. Но когда я использую свою библиотеку в приложении, проект Pods создается из Podspec, который не включает обязательный флаг.

Решение заключается в использовании крюка post_install в подпикселе приложения для управления созданным xcconfig проекта Pods.

post_install do |installer| 

    file_names = ['./Pods/Pods-ServerA.xcconfig', 
        './Pods/Pods-ServerB.xcconfig'] 

    # rename existing pre-processor definitions 
    file_names.each do |file_name| 
     text = File.read(file_name) 
     File.open(file_name, 'w') { |f| f.puts text.gsub(/GCC_PREPROCESSOR_DEFINITIONS/, "GCC_PREPROCESSOR_DEFINITIONS_SHARED")} 
    end 

    # merge existing and required definition for ServerA 
    File.open('./Pods/Pods-ServerA.xcconfig', 'a') { |f| 
     f.puts "\nGCC_PREPROCESSOR_DEFINITIONS=$(GCC_PREPROCESSOR_DEFINITIONS_SHARED) ServerA=1" 
    } 

    # merge existing and required definition for ServerB 
    File.open('./Pods/Pods-ServerB.xcconfig', 'b') { |f| 
     f.puts "\nGCC_PREPROCESSOR_DEFINITIONS=$(GCC_PREPROCESSOR_DEFINITIONS_SHARED) ServerB=1" 
    } 

end 

Код немного подробный, так как я не знаком с Ruby, но он работает. Необходимо легко автоматизировать этот процесс переименования-добавления, если переменная и библиотека следуют схеме именования.

 Смежные вопросы

  • Нет связанных вопросов^_^