2013-03-06 16 views
15

Pracuję nad projektem iOS, w którym znajdujemy się w niefortunnej sytuacji, że niektóre z bibliotek, które musimy użyć, są dostępne w dwóch wersjach. Wersja do debugowania i wersja do produkcji. Nie można debugować przy użyciu biblioteki produkcyjnej. i nie można również używać biblioteki debugowania. w produkcji.złożony projekt Xcode z wieloma plikami .xcconfig i cocoapods

Aby rozwiązać ten problem, w projekcie ustawiliśmy wiele celów (jeden do debugowania i drugi do produkcji). Cele te używają osobnych plików .xcconfig (App-Debug.xcconfig i App-Production.xcconfig), aby zdefiniować: LIBRARY_SEARCH_PATHS, HEADER_SEARCH_PATHS & OTHER_LDFLAGS dla każdego celu.

To wszystko działa świetnie, ale ręczne śledzenie wszystkich zależności od innych dostawców jest bardzo trudne. Dlatego zdecydowaliśmy się rozpocząć korzystanie z CocoaPods w celu zarządzania niektórymi z naszych zewnętrznych zależności.

Ale z powodu tych bibliotek "dwóch wersji" nie możemy używać Pods.xcconfig zgodnie z przeznaczeniem, ale musimy dodać ustawienia z niego do naszego App-Debug.xcconfig i App-Production.xcconfig.

Nie jestem pewien, jak to zrobić, ponieważ wszystko, co próbuję, wydaje się nie kompilować, ponieważ nie można znaleźć moich kapsuł.

Nasz Pods.xcconfig:

ALWAYS_SEARCH_USER_PATHS = YES 
HEADER_SEARCH_PATHS = ${PODS_HEADERS_SEARCH_PATHS} 
LIBRARY_SEARCH_PATHS = "$(PODS_ROOT)/TestFlightSDK" 
OTHER_LDFLAGS = -ObjC -lTestFlight -lz -framework SystemConfiguration -framework UIKit 
PODS_BUILD_HEADERS_SEARCH_PATHS = "${PODS_ROOT}/BuildHeaders" "${PODS_ROOT}/BuildHeaders/AFNetworking" "${PODS_ROOT}/BuildHeaders/TestFlightSDK" 
PODS_HEADERS_SEARCH_PATHS = ${PODS_PUBLIC_HEADERS_SEARCH_PATHS} 
PODS_PUBLIC_HEADERS_SEARCH_PATHS = "${PODS_ROOT}/Headers" "${PODS_ROOT}/Headers/AFNetworking" "${PODS_ROOT}/Headers/TestFlightSDK" 
PODS_ROOT = ${SRCROOT}/Pods 

App-Debug.xcconfig:

#include "Config-XXX.xcconfig" 
#include "Config-Tesseract.xcconfig" 
#include "Config-AppMeasurement.xcconfig" 
#include "Config-Libxml2.xcconfig" 
#include "Config-Frameworks.xcconfig" 

LIBRARY_SEARCH_PATHS = $(inherited) $(XXX_LIBRARY_SEARCH_PATH_DEBUG) $(TESSERACT_LIBRARY_SEARCH_PATH) $(APPMEASUREMENT_LIBRARY_SEARCH_PATH) 

HEADER_SEARCH_PATHS = $(inherited) $(TESSERACT_HEADER_SEARCH_PATH) $(LIBXML2_HEADER_SEARCH_PATH) $(XXX_HEADER_SEARCH_PATH) 

OTHER_LDFLAGS = $(inherited) -lz -lxml2 -lstdc++ -all_load -ObjC -lXXXLibrary $(APPLE_FRAMEWORKS) 

App-Production.xcconfig:

#include "Config-XXX.xcconfig" 
#include "Config-Tesseract.xcconfig" 
#include "Config-AppMeasurement.xcconfig" 
#include "Config-Libxml2.xcconfig" 
#include "Config-Frameworks.xcconfig" 

LIBRARY_SEARCH_PATHS = $(inherited) $(XXX_LIBRARY_SEARCH_PATH_PRODUCTION) $(TESSERACT_LIBRARY_SEARCH_PATH) $(APPMEASUREMENT_LIBRARY_SEARCH_PATH) 

HEADER_SEARCH_PATHS = $(inherited) $(TESSERACT_HEADER_SEARCH_PATH) $(LIBXML2_HEADER_SEARCH_PATH) $(XXX_HEADER_SEARCH_PATH) 

OTHER_LDFLAGS = $(inherited) -lz -lxml2 -lstdc++ -all_load -ObjC -lXXXLibrary $(APPLE_FRAMEWORKS) 

config-XXX.xcconfig:

XXX_LIBRARY_SEARCH_PATH_DEBUG = "$(SRCROOT)/External/XXX" 
XXX_LIBRARY_SEARCH_PATH_PRODUCTION = "$(SRCROOT)/External/XXX/LibProd" 

XXX_HEADER_SEARCH_PATH = "$(SRCROOT)/External/XXX/headers" 

Jak widać zarówno Pods.xcconfig, jak i nasz własny App-Debug.xcconfig ustawia: LIBRARY_SEARCH_PATHS, HEADER_SEARCH_PATHS & OTHER_LDFLAGS.

Potrzebuję, aby wartości zadeklarowane w Pods.xcconfig zostały dołączone do wartości, które deklarujemy w App-Debug.xcconfig.

Używamy Xcode 4.6 i budynku dla iOS 4.3.

Odpowiedz

14

Twój podfile może w tym pomóc. Należy skończyć z czymś jak to

platform :ios, "5.0" 
link_with ['App', 'App-Debug'] 

pod 'Shared-Pod' 

target :App, :exclusive => true do 
    pod 'Normal-Pod' 
end 

target :App-Debug, :exclusive => true do 
    pod 'Debug-Pod' 
end 

to będzie generować dwa pliki xcconfig, po jednym dla każdego celu.

+0

To jest naprawdę niesamowite, nie miałem pojęcia, że ​​to możliwe. Spróbuję, przez kilka następnych dni - Nie mamy konfiguracji do obsługi niestandardowych kapsułek (jeszcze). – cvknage

1

Zamiast używać dwóch celów, spróbuj zdefiniować różne wartości dla XXX_LIBRARY_PATH w konfiguracji (najprościej w GUI, niestety). Jeśli masz tylko dwie konfiguracje i są one odpowiednio nazwane, możesz nawet zrobić coś takiego, jak XXX_LIBRARY_PATH = FooPath/$(CONFIGURATION).

Jedna konfiguracja celu nie umożliwia dołączania właściwości do innej; "dziedziczenie" to ściśle SDK → Projekt [Config] → Cel [Config].

+0

Sposób, w jaki rozwiązaliśmy to teraz (bez użycia cocoapods), polega na zdefiniowaniu dwóch ścieżek wyszukiwania dla biblioteki XXXLibrary. Edytowałem swój wpis z zawartością pliku Config-XXX.xcconfig Jednak to nie jest problem, problem pojawia się, gdy próbujemy przenieść niektóre z naszych niezależnych zależności do cocoapods. Wtedy nie można znaleźć zależności, które przenosimy, przez Xcode, a projekt nie będzie budowany. – cvknage

Powiązane problemy