2013-03-06 25 views
15

Sto lavorando a un progetto iOS in cui ci troviamo nella sfortunata situazione in cui alcune delle librerie che dobbiamo usare sono disponibili in due versioni. Una versione per il debug e una versione per la produzione. Non è possibile eseguire il debug con la lib di produzione. e allo stesso modo non è possibile usare la lib di debug. in produzione.progetto Xcode complesso con più file .xcconfig e cocoapods

Per risolvere questo problema sono stati impostati più obiettivi (uno per il debug e uno per la produzione) nel progetto. Questi obiettivi utilizzano file .xcconfig separati (App-Debug.xcconfig e App-Production.xcconfig) per definire: LIBRARY_SEARCH_PATHS, HEADER_SEARCH_PATHS & OTHER_LDFLAGS per ciascun target.

Questo funziona perfettamente, ma sta diventando un problema tenere traccia di tutte le dipendenze di terze parti manualmente. Quindi abbiamo deciso di iniziare a utilizzare CocoaPods per gestire alcune delle nostre dipendenze di terze parti.

Ma a causa di queste librerie "a due versioni" non è possibile utilizzare Pods.xcconfig come previsto, ma è necessario aggiungere le impostazioni da esso alle proprie App-Debug.xcconfig e App-Production.xcconfig.

Non sono sicuro del modo corretto per farlo, poiché tutto ciò che provo, sembra non essere compilato perché i miei pod non possono essere trovati.

nostro 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" 

Come possiamo vedere sia Pods.xcconfig che la nostra App-Debug.xcconfig imposta: LIBRARY_SEARCH_PATHS, HEADER_SEARCH_PATHS & OTHER_LDFLAGS.

Quello che mi serve è avere i valori dichiarati in Pods.xcconfig aggiunti ai valori dichiarati in App-Debug.xcconfig.

Stiamo utilizzando Xcode 4.6 e lo sviluppo per iOS 4.3.

risposta

14

Il tuo podfile può supportare questo. Si dovrebbe finire con qualcosa di simile

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 

Questo genererà due file xcconfig, uno per ciascun target.

+0

Questo è davvero fantastico, non avevo idea che fosse possibile. Nei prossimi giorni farò un tentativo, non abbiamo ancora nessuna configurazione per gestire i pod personalizzati (ancora). – cvknage

1

Invece di utilizzare due target, provare a definire valori diversi per XXX_LIBRARY_PATH nella configurazione (più semplice nella GUI, purtroppo). Se hai solo due configurazioni e sono nominate in modo appropriato, puoi anche fare qualcosa come XXX_LIBRARY_PATH = FooPath/$(CONFIGURATION).

Non è possibile per una configurazione di destinazione aggiungere proprietà a un'altra; la "ereditarietà" è rigorosamente SDK → Progetto [Config] → Destinazione [Config].

+0

Il modo in cui l'abbiamo risolto ora (senza usare i cocoapod) è la definizione di due percorsi di ricerca per la XXXLibrary. Ho modificato il mio post con i contenuti di Config-XXX.xcconfig Tuttavia, questo non è il problema, il problema si presenta quando proviamo a spostare alcune delle nostre dipendenze di terze parti in cocoapods. Quindi le dipendenze che spostiamo non possono essere trovate da Xcode, e il progetto non costruirà. – cvknage

Problemi correlati