2015-06-17 8 views
19

Ich entwickle eine App und verwende eine Open-Source-Komponente.Wie kompiliere ich ein Projekt mit App und Bibliothek im selben Arbeitsbereich mit verschiedenen Konfigurationsnamen?

Ich habe einen Arbeitsbereich, die sowohl MyApp.xcodeproj und Component.xcodeproj. Meine app hat drei Konfigurationen: Debug, App Store und In House aber die Komponente hat nur zwei: Debug und Mitteilung

Im Debug Konfiguration, funktioniert alles gut, aber ich kann meine App in App Store oder In House Konfiguration nicht kompilieren, weil die Konfigurationsnamen nicht übereinstimmen. Ich erhalte eine Datei nicht Fehler gefunden, wenn sie #import <Component/Component.h>

versuchen, ich brauche beide App Store und In House Konfigurationen und ich würde wirklich gerne vermeiden die Komponentenkonfigurationen zu modifizieren, zukünftige Updates der Komponente zu erleichtern.

Ich weiß, ich CocoaPods verwenden könnte, dieses Problem zu lösen, aber ich würde gerne wissen, ob es eine einfache Lösung in Xcode ist

+0

Ich benutzte diese Frage, um mir zu helfen, diese Situation herauszufinden, aber umgekehrt. Die App hat 2 Configs, aber das Framework hat 3. Ich habe jetzt Probleme damit, wenn ich versuche, zu einer benutzerdefinierten Config zu wechseln (nicht debuggen oder release). Es scheint nicht die Konfiguration des Frameworks zu respektieren, obwohl das Eltern-Projekt 'DEFAULT_CONFIGURATION' für jede Eltern-Konfiguration gesetzt wurde –

Antwort

35

Sie Ihr Projekt mit einem paar kleinen Änderungen an Ihrem App-Einstellungen zu kompilieren bekommen.

Ich empfehle Ihnen, alle Einstellungen auf Projektebene zu ändern, damit alle Ihre Ziele diese Einstellungen erben können. In

  1. eine neue DEFAULT_CONFIGURATION benutzerdefinierte Einstellung und definieren Sie Ihre Konfigurationszuordnung. Dies ist, wie es aussehen sollte:

    Default Configuration Screenshot

  2. Set FRAMEWORK_SEARCH_PATHS zu $(BUILD_DIR)/$(DEFAULT_CONFIGURATION)-$(PLATFORM_NAME) für alle Konfigurationen, fügen Beliebig SDK OS X Varianten und setzen Sie den Wert auf $(BUILD_DIR)/$(DEFAULT_CONFIGURATION). Set HEADER_SEARCH_PATHS zu $(FRAMEWORK_SEARCH_PATHS)/include und LIBRARY_SEARCH_PATHS zu $(FRAMEWORK_SEARCH_PATHS). Dies ist, wie es aussehen soll:

    Search Paths Screenshot

    ist ziemlich langweilig Dieser Schritt kann mit dem xcproj Werkzeug automatisiert werden und durch dieses Skript in Ihrem Projektverzeichnis ausgeführt wird. Bearbeiten Sie Ihr Konfigurations-Mapping nach Bedarf.

    #!/bin/bash 
    
    CONFIGURATIONS=("App Store:Release" "In House:Release" "Debug:Debug") 
    
    for CONFIGURATION in "${CONFIGURATIONS[@]}"; do 
        xcproj --configuration "${CONFIGURATION%%:*}" write-build-setting DEFAULT_CONFIGURATION "${CONFIGURATION#*:}" 
    done 
    
    xcproj write-build-setting 'FRAMEWORK_SEARCH_PATHS' '$(BUILD_DIR)/$(DEFAULT_CONFIGURATION)-$(PLATFORM_NAME)' 
    xcproj write-build-setting 'FRAMEWORK_SEARCH_PATHS[sdk=macosx*]' '$(BUILD_DIR)/$(DEFAULT_CONFIGURATION)' 
    
    xcproj write-build-setting 'HEADER_SEARCH_PATHS' '$(FRAMEWORK_SEARCH_PATHS)/include' 
    xcproj write-build-setting 'LIBRARY_SEARCH_PATHS' '$(FRAMEWORK_SEARCH_PATHS)' 
    
  3. Wenn die Komponente als statische Bibliothek verteilt ist, sind Sie hier fertig. Wenn die Komponente als Framework geliefert wird, müssen Sie ihre Pfadreferenz aktualisieren, indem Sie Ihre project.pbxproj-Datei in einem Texteditor bearbeiten. Im PBXFileReference Abschnitt (unter /* Begin PBXFileReference section */) finden Component.framework und seine path wie folgt aktualisiert:

    name = Component.framework; path = "../$(DEFAULT_CONFIGURATION)/Component.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 
    

    auch sicher, dass die sourceTree-BUILT_PRODUCTS_DIR gesetzt ist, das heißtrelativ zu gebauten Produkten. Sobald Sie die Projektdatei bearbeitet, sollte dies wie folgt aussehen:

    Location Screenshot

Ihr Projekt sollte nun wie erwartet bauen.

+1

Dies funktioniert perfekt. Hat meinen Schwanz gerettet. – tidwall

+0

Das funktioniert nicht für mich, wenn ich nicht Debug-Debugger eingestellt habe. Xcode wird implizit die Version eins erstellen, die zu Ihrem Beispiel passt. Wenn ich InHouse auf Debug setze, bekomme ich Kompilierungsfehler. –

+0

Weiter zu @ BrentleyJones Kommentar: Ist es möglich, dass diese Lösung nur für den spezifischen Fall funktioniert? Beachten Sie, dass "Debug" auf "Debug" und "Debug" auf "Release" abgebildet wird. Was ist, wenn die Bibliothek nicht "Debug" und "Release" verwendet, sondern stattdessen "Blau" und "Rot" - funktioniert das noch? – Jeremy

1

ich das gleiche Problem hatte, aber ich hatte mehrere Konfigurationen (Debug, Testflug, Veröffentlichung, Unternehmen) in meiner Anwendung, und die bolded Konfigurationen würden immer scheitern zu bauen weil es nicht die Rahmenbedingungen finden kann. Ich wollte mich wirklich nicht mit den Projekteinstellungen meiner Unterprojekte anlegen, um die Aktualisierung zu vereinfachen.

Die Antwort, die ich fand, war, nur den Framework-Suchpfad zu aktualisieren, um zu berücksichtigen, dass die Frameworks in Release (oder wie auch immer die Standardkonfiguration eingestellt ist) der Subprojekte fallengelassen wurden.

Insbesondere stelle ich es an: $ (build_dir)/Veröffentlichung - $ (PLATFORM_NAME)

ich es auch rekursiv gesetzt zu sein. Dies funktioniert sowohl für den Simulator als auch für das Gerät und baut in Xcode und in der Befehlszeile auf.

Verwandte Themen