3

さまざまなサーバーを処理するクラスライブラリであるiOSプロジェクトを開発しました。ライブラリが使用されるアプリケーションごとに必要なサーバーは1つだけです。サーバータイプは、コンパイル時にプリプロセッサ定義を介して構成できます。

ライブラリのpodspecで、次のようにサーバーごとにさまざまなサブスペックを定義しました。

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

私のアプリケーションは、顧客ごとに1つのターゲットを持つマルチ顧客アプリです。各顧客は、ライブラリプロジェクトの特定のサーバーを使用します。したがって、私の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は、サブスペックで定義されたすべてのフラグをすべてのpod-customerN.xcconfigファイルの1つの値にマージすることです。

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

Cocoapodsのこの間違った(?)動作を回避する方法の提案はありますか?ドキュメントを理解している限り、サブスペックプロパティは、同じレベルのサブスペックではなく、親スペックからのみ継承する必要があります。

4

1 に答える 1

2

回避策を見つけましたが、それほどエレガントではないかもしれません:

pod installすべてのコンパイラフラグを1つにマージするため、ライブラリのファイルからを削除する必要がありましGCC_PREPROCESSOR_DEFINITIONSpodspec。しかし、この定義がないと、私のライブラリは構築されません。

Xcodeでは、これは各ライブラリのターゲットに定義を追加することで簡単に修正できます。しかし、アプリケーションでライブラリを使用すると、Podsプロジェクトは必要なフラグを含まないPodspecから生成されます。

解決策は、アプリケーションのPodfileのフックを使用して、post_installPodsプロジェクトの生成されたxcconfigを操作することです。

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に慣れていないので、コードは少し冗長ですが、機能します。変数とライブラリが命名スキームに従っている限り、この名前変更追加プロセスを自動化することは簡単に可能です。

于 2013-09-24T09:15:55.817 に答える