2014-01-10 74 views
18

我遇到一個名爲DCIntrospect-ARC的應用程序問題,它只能在DEBUG模式下工作。它會在運行之前檢查DEBUG宏是否已定義。然而,它沒有在CocoaPods目標中定義,即使我在Xcode中以調試模式運行,它也無法運行,因爲DEBUG宏沒有定義。未定義爲CocoaPods目標的DEBUG預處理器宏

我可以使用

s.xcconfig = { "GCC_PREPROCESSOR_DEFINITIONS" => '$(inherited) DEBUG=1' } 

限定在podspec的DEBUG宏但是這定義爲所有DEBUG生成配置和不僅是調試配置。

  1. 這是一個CocoaPods的問題?不應該一般爲Pods定義DEBUG宏嗎?
  2. 我可以在Podspec文件中解決這個問題,並只在調試版本配置中聲明DEBUG宏嗎?

回答

19

您可以使用Podfile中的post_install掛鉤。

該掛鉤允許您在生成的Xcode項目寫入磁盤或任何其他您想要執行的任務之前對其進行最後的更改。 http://guides.cocoapods.org/syntax/podfile.html#post_install

post_install do |installer_representation| 
    installer_representation.pods_project.targets.each do |target| 
     target.build_configurations.each do |config| 
      if config.name != 'Release' 
       config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'DEBUG=1'] 
      end 
     end 
    end 
end 
+3

使用cocoapods版本1.0.0.beta.3我必須使用installer_representation.pods_project而不是installer_representation.project –

+0

這不適用於Swift Pods。我在下面添加了一個答案,該解決方案增加了一行,所以它也適用於Swift Pods – xaphod

11

感謝John我完成了我的自定義腳本podfile,這也改變了優化級別爲零,使斷言。

我有多個調試配置(ACC和PROD),所以我需要更新幾個屬性進行調試。

分享是關懷,希望有人認爲這有用。

post_install do |installer| 
    installer.project.build_configurations.each do |config| 
    if config.name.include?("Debug") 
     # Set optimization level for project 
     config.build_settings['GCC_OPTIMIZATION_LEVEL'] = '0' 

     # Add DEBUG to custom configurations containing 'Debug' 
     config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)'] 
     if !config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'].include? 'DEBUG=1' 
     config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'DEBUG=1' 
     end 
    end 
    end 

    installer.project.targets.each do |target| 
    target.build_configurations.each do |config| 
     if config.name.include?("Debug") 
      # Set optimization level for target 
      config.build_settings['GCC_OPTIMIZATION_LEVEL'] = '0' 

      # Add DEBUG to custom configurations containing 'Debug' 
      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)'] 
      if !config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'].include? 'DEBUG=1' 
      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'DEBUG=1' 
      end 

      # Enable assertions for target 
      config.build_settings['ENABLE_NS_ASSERTIONS'] = 'YES' 

      config.build_settings['OTHER_CFLAGS'] ||= ['$(inherited)'] 
      if config.build_settings['OTHER_CFLAGS'].include? '-DNS_BLOCK_ASSERTIONS=1' 
      config.build_settings['OTHER_CFLAGS'].delete('-DNS_BLOCK_ASSERTIONS=1') 
      end 
     end 
     end 
    end 
end 
+0

Hi @Antoine'project'現在是'pods_project' – amosel

-2

即使簡單:只要確保你有DEBUG=1宏您GCC_PREPROCESSOR_DEFINITIONS在Xcode中的項目爲調試模式,但不發佈模式。如果您將其添加到項目級別(而不是特定目標),它將被所有目標(調試測試,自定義目標等)繼承。這在新項目中默認設置,並且通常預期在那裏。如果你錯過了,那可能會產生廣泛的影響。

如果它仍然無法正常工作,請確保您在GCC_PREPROCESSOR_DEFINITIONS的所有目標中也有$(inherited)。 CocoaPods和DEBUG都指望這一點。

settings

+1

不適用於cocoapods,這就是問題 – xaphod

0

接受的答案,截至目前並沒有對雨燕豆莢工作。 以下是對該答案的單行更改,似乎適用於兩者。

post_install do |installer_representation| 
     installer_representation.pods_project.targets.each do |target| 
      target.build_configurations.each do |config| 
       if config.name != 'Release' 
        config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'DEBUG=1'] 
        config.build_settings['OTHER_SWIFT_FLAGS'] = ['$(inherited)', '-DDEBUG'] 
       end 
      end 
     end 
    end 
0

我認爲接受的答案並不適合我。 config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'DEBUG=1']

||=用於分配一個空或零變量,但如果config.build_settings['GCC_PREPROCESSOR_DEFINITIONS']不是空的?

該數組根本無法修改。值爲["POD_CONFIGURATION_PRODUCTION=1", "$(inherited)"]

所以我給了完整的anwser。

post_install do |installer_representation| 
    installer_representation.pods_project.build_configurations.each do |config| 
     if config.name == 'Release' || config.name == 'Production' || config.name == 'Release-InHouse' 
      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [] 
      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] |= ['$(inherited)', 'NDEBUG=1'] 
     end 
    end 
end 

|| = []確保該變量是一個有效的數組。而arrayA |= arrayB意味着arrayA + arrayB並去掉重複的元素,然後返回到arrayA。