私のプロジェクトでは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
を変更するにはどうすればよいですか?
私は同じ問題に出くわしました。最初に私は明白に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
上記の回答と 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でテスト済み。
ここに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)
私はポッドバージョン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