web-dev-qa-db-ja.com

異なる構成名で同じワークスペースにアプリとライブラリを含むプロジェクトをコンパイルするにはどうすればよいですか?

私はアプリを開発していて、オープンソースコンポーネントを使用しています。

MyApp.xcodeprojComponent.xcodeprojの両方を含むワークスペースがあります。私のアプリには3つの構成があります:デバッグアプリストアおよび社内ですが、コンポーネントには2つしかありません:デバッグおよびリリース

Debug構成では、すべて正常に機能しますが、構成名がそうであるため、App StoreまたはIn House構成でアプリをコンパイルできません。合わない。 #import <Component/Component.h>を実行しようとすると、ファイルが見つかりませんというエラーが発生します

App StoreIn Houseの両方の構成が必要ですが、コンポーネントの将来の更新を容易にするために、コンポーネントの構成を変更することは避けたいと思います。

CocoaPodsを使用してこの問題を解決できることは知っていますが、Xcodeに簡単な解決策があるかどうか知りたいです

24
0xced

アプリの設定を微調整して、プロジェクトをコンパイルできます。

すべてのターゲットがこれらの設定を継承できるように、プロジェクトレベルですべての設定を変更することをお勧めします。

  1. 新しいDEFAULT_CONFIGURATIONユーザー定義設定を追加し、構成マッピングを定義します。これはどのように見えるべきかです:

    Default Configuration Screenshot

  2. すべての構成でFRAMEWORK_SEARCH_PATHS$(BUILD_DIR)/$(DEFAULT_CONFIGURATION)-$(PLATFORM_NAME)に設定し、Any OS X SDKバリアントを追加して、値を$(BUILD_DIR)/$(DEFAULT_CONFIGURATION)に設定します。 。 HEADER_SEARCH_PATHS$(FRAMEWORK_SEARCH_PATHS)/includeに設定し、LIBRARY_SEARCH_PATHS$(FRAMEWORK_SEARCH_PATHS)に設定します。これはどのように見えるべきかです:

    Search Paths Screenshot

    この手順は非常に面倒です。 xcproj ツールを使用し、プロジェクトディレクトリでこのスクリプトを実行することで自動化できます。必要に応じて、構成マッピングを編集します。

    #!/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. コンポーネントが静的ライブラリとして配布されている場合は、ここで完了です。コンポーネントがフレームワークとして提供されている場合は、テキストエディタでproject.pbxprojファイルを編集してパス参照を更新する必要があります。 PBXFileReferenceセクション(/* Begin PBXFileReference section */の下)でComponent.frameworkを見つけ、そのpathを次のように更新します。

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

    また、sourceTreeBUILT_PRODUCTS_DIRに設定されていること、つまりビルドされた製品に関連していることを確認してください。プロジェクトファイルを編集すると、次のようになります。

    Location Screenshot

これで、プロジェクトは期待どおりにビルドされます。

43
0xced

これと同じ問題が発生しましたが、アプリに複数の構成(Debug、TestFlight、Release、Enterprise)があり、太字の構成は常にビルドに失敗し、できませんでした。フレームワークが見つかりません。サブプロジェクトの更新を簡単にするために、サブプロジェクトのプロジェクト設定をいじりたくありませんでした。

私が見つけた答えは、フレームワークがサブプロジェクトのリリース(またはデフォルト構成に設定されているもの)でドロップされるという事実を考慮して、フレームワーク検索パスを更新することでした。

具体的には、$(BUILD_DIR)/ Release-$(PLATFORM_NAME)に設定しました。

私も再帰的に設定しました。これは、シミュレータとデバイスの両方で機能し、Xcodeとコマンドラインで構築されます。

6
gpios