web-dev-qa-db-ja.com

CocoaPodsのポストインストールフックを介してOTHER_LDFLAGSを変更するにはどうすればよいですか?

私のプロジェクトではCocoaPodsとカスタムxcconfigファイルを使用しています。これまでは、これで問題は発生していません。カスタム構成の最後にCocoaPodsで生成された構成を#includeする必要がありました。

ただし、xcconfigに基づいてOTHER_LDFLAGSを条件付きで指定する必要があるという問題に遭遇しましたが、これを行う方法がわかりません。

まず、次のようにOTHER_LDFLAGSをログに記録しようとしましたが、フラグは実際にはログに記録されていません。

post_install do |installer_representation|
  installer_representation.project.targets.each do |target|
    target.build_configurations.each do |config|      

      name = target.name
      puts "Target Found: #{name}"

      flags = config.build_settings['OTHER_LDFLAGS']
      puts "OTHER_LDFLAGS Found: #{flags}"
    end
  end
end

出力は次のようになります。

Target Found: Pods-ProjectName-DependencyName1
OTHER_LDFLAGS Found: # nothing here...?
Target Found: Pods-ProjectName-DependencyName2    
OTHER_LDFLAGS Found: # again nothing...
# etc...
Target Found: Pods-ProjectName  # Cool, this is the main target pod
OTHER_LDFLAGS Found: # ...

CocoaPodsのポストインストールフックを使用して実際にOTHER_LDFLAGSを変更するにはどうすればよいですか?

27
JRG-Developer

私は同じ問題に出くわしました。最初に私は明白にOTHER_LDFLAGSを変更しようとしました:

post_install do |installer|
    installer.pods_project.targets.each do |target|
        if target.name == "Pods-SomeTarget"
            puts "Updating #{target.name} OTHER_LDFLAGS"
            target.build_configurations.each do |config|
                config.build_settings['OTHER_LDFLAGS'] ||= ['$(inherited)']
                config.build_settings['OTHER_LDFLAGS'] << '-l"AFNetworking"'
            end
        end
    end
end

しかし、それはうまくいきませんでした。関連するxcconfigは変更を取得しませんでした。結局私はうまくいく回避策を見つけました-最初にpost_intallフックの関連するxcconfigファイルの内容を読んで、それを変更して書き戻します:

v1.

post_install do |installer|
    installer.pods_project.targets.each do |target|
        if target.name == "Pods-SomeTarget"
            puts "Updating #{target.name} OTHER_LDFLAGS"
            target.build_configurations.each do |config|
                xcconfig_path = config.base_configuration_reference.real_path
                xcconfig = File.read(xcconfig_path)
                new_xcconfig = xcconfig.sub('OTHER_LDFLAGS = $(inherited)', 'OTHER_LDFLAGS = $(inherited) -l"AFNetworking"')
                File.open(xcconfig_path, "w") { |file| file << new_xcconfig }
            end
        end
    end
end

[〜#〜] edit [〜#〜]v1.の改善。 xcconfig Stringコンテンツを直接操作する代わりに、xccconfigをbuild_configuration Hashに読み込んで、ハッシュを変更してから、xcconfigにフラッシュします。

v1.5

post_install do |installer|
    installer.pods_project.targets.each do |target|
        if target.name == "Pods-SomeTarget"
            puts "Updating #{target.name} OTHER_LDFLAGS"
            target.build_configurations.each do |config|
                xcconfig_path = config.base_configuration_reference.real_path

                # read from xcconfig to build_settings dictionary
                build_settings = Hash[*File.read(xcconfig_path).lines.map{|x| x.split(/\s*=\s*/, 2)}.flatten]

                # modify OTHER_LDFLAGS
                build_settings['OTHER_LDFLAGS'] << '-l"AFNetworking"'

                # write build_settings dictionary to xcconfig
                build_settings.each do |key,value|
                  File.open(xcconfig_path, "a") {|file| file.puts key = value}
                end
            end
        end
    end
end
31
mrvincenzo

上記の回答と cocoapods および xcodeproj の公式のrubydocsに基づいて、私はこのソリューションを思いつきました。

post_install do |installer|
    installer.aggregate_targets.each do |aggregate_target|
        aggregate_target.xcconfigs.each do |config_name, config_file|
            config_file.attributes['OTHER_LDFLAGS'] << '-l"AFNetworking"'

            xcconfig_path = aggregate_target.xcconfig_path(config_name)
            config_file.save_as(xcconfig_path)
        end
    end
end

これにより、すべての集約ターゲット( 'Pod -...')のxcconfigファイルにリンカーフラグ-l"AFNetworking"が正常に追加されます。

Xcode8.3.3およびXcode9 Beta 4のcocoapods 1.2.0および1.3.0でテスト済み。

13
Sven Driemecker

ここにv1.0の使用例があります。個別のxcconfigを持ち、共通のxcconfigファイルを共有する複数のアプリがあるため、このスレッドに出くわしました。アプリ拡張機能をターゲットとして追加すると、ポッドの使用が崩れ始め、アクティブな構成(デバッグなど)のプロジェクトレベルの継承を共有できなくなりました。上からv1.0を使用して、OO_LDFLAGSなどのポッドレベル要素の名前をPODS_OTHER_LDFLAGSに変更し、それらをxcconfigsに安全に#include(他の値を踏み込むことなく)して、共通のアプリ、ターゲット設定alaとマージできます。

OTHER_LDFLAGS = $(inherited) $(PODS_OTHER_LDFLAGS) $(COMMON_OTHER_LDFLAGS)

したがって、私のポッドファイルには、v1.0のようなループ内に次のようなセクションがあります。

    puts "Updating #{target.name} adapting settings like OTHER_LDFLAGS for merging at target level"
    xcconfig_path = config.base_configuration_reference.real_path
    xcconfig = File.read(xcconfig_path)
    xcconfig = xcconfig.sub('OTHER_LDFLAGS = $(inherited)', 'PODS_OTHER_LDFLAGS = ')
    xcconfig = xcconfig.sub('OTHER_CFLAGS = $(inherited)', 'PODS_OTHER_CFLAGS = ')
    xcconfig = xcconfig.sub('GCC_PREPROCESSOR_DEFINITIONS = $(inherited)', 'PODS_GCC_PREPROCESSOR_DEFINITIONS = ')
    xcconfig = xcconfig.sub('HEADER_SEARCH_PATHS = $(inherited)', 'PODS_HEADER_SEARCH_PATHS = ')
    xcconfig = xcconfig.sub('LIBRARY_SEARCH_PATHS = $(inherited)', 'PODS_LIBRARY_SEARCH_PATHS = ')
    File.open(xcconfig_path, "w") { |file| file << xcconfig }

そして、ターゲットレベルalaで設定されたグルーxcconfig:

#include "../../Pods/Target Support Files/Pods-Fusion/Pods-Fusion.release.xcconfig"
#include "../../shared/main/config/release.xcconfig"
#include "../../shared/main/config/allTargetsCommon.xcconfig"
#include "Fusion.xcconfig"
#include "../../shared/main/config/merge.xcconfig"

ここで、さまざまなapp/config/common/pod設定が取り込まれ、merge.xcconfigは次のようにすべてをまとめます。

//merge up the pods, common base target and target configs

GCC_PREPROCESSOR_DEFINITIONS = $(inherited) $(PODS_GCC_PREPROCESSOR_DEFINITIONS) $(TARGET_GCC_PREPROCESSOR_DEFINITIONS) $(APP_GCC_PREPROCESSOR_DEFINITIONS)
HEADER_SEARCH_PATHS = $(inherited) $(PODS_HEADER_SEARCH_PATHS)
OTHER_CFLAGS = $(inherited) $(PODS_OTHER_CFLAGS) $(TARGET_OTHER_CFLAGS)
OTHER_LDFLAGS = $(inherited) $(PODS_OTHER_LDFLAGS) $(COMMON_OTHER_LDFLAGS)
3
troppoli

私はポッドバージョン1.8.4を実行していますが、上記のすべてが機能しなかったので、誰かに役立つ場合に備えて、ここに投稿してください

以下のスクリプトは@mrvincenzoの回答に基づいていますが、機能させるためにいくつかの変更を行う必要がありました。これにより、-ObjCフラグがOTHER_LDFLAGSに正常に追加されます。これにより、既存のリストが保持され、追加のみが行われますそれへの旗

post_install do |installer|
  installer.pods_project.targets.each do |target|
    #replace `Pod-target-lib` with your target library
    if target.name == "Pod-target-lib"
      puts "Updating #{target.name} OTHER_LDFLAGS"
      xcconfig_path = ""
      target.build_configurations.each do |config|
        new_xcconfig_path = config.base_configuration_reference.real_path
        if new_xcconfig_path != xcconfig_path
          xcconfig_path = config.base_configuration_reference.real_path

          # read from xcconfig to build_settings dictionary
          build_settings = Hash[*File.read(xcconfig_path).lines.map{|x| x.split(/\s*=\s*/, 2)}.flatten]

          # modify OTHER_LDFLAGS
          build_settings['OTHER_LDFLAGS'] = "-ObjC #{build_settings['OTHER_LDFLAGS']}"

          # clear current file content
          File.open(xcconfig_path, "w") {|file| file.puts ""}

          # write build_settings dictionary to xcconfig
          build_settings.each do |key,value|
            File.open(xcconfig_path, "a") {|file| file.puts "#{key} = #{value}"}
          end
        end
      end
    end
  end
end
0
Amr Labib