Question

Je rencontre des problèmes avec un pod appelé DCIntrospect-ARC qui ne devrait fonctionner qu'en mode DEBUG.Il vérifie si la macro DEBUG est définie avant de s'exécuter.Cependant, il n'est pas défini dans la cible CocoaPods et même si j'exécute en mode débogage dans Xcode, son exécution ne parvient pas car la macro DEBUG n'est pas définie.

Je peux définir la macro DEBUG dans le podspec en utilisant

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

mais cela a défini DEBUG pour toutes les configurations de build et pas seulement la configuration DEBUG.

  1. Est-ce un problème avec CocoaPods ?La macro DEBUG ne devrait-elle pas généralement être définie pour les Pods ?
  2. Puis-je contourner ce problème dans le fichier Podspec et déclarer la macro DEBUG uniquement dans la configuration de build Debug ?
Était-ce utile?

La solution

Vous pouvez utiliser le crochet Post_install dans Podfile.

Ce crochet vous permet de modifier les derniers modifications du projet Xcode généré avant qu'il ne soit écrit sur le disque, ou toute autre tâche que vous pourriez souhaiter effectuer. http://guides.cocoapods.org/ysyntax/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

Autres conseils

Grâce à John, j'ai terminé mon script Podfile personnalisé, qui modifie également le niveau d'optimisation à zéro et active les assertions.

J'ai plusieurs configurations de débogage (pour ACC et Prod), j'ai donc besoin de mettre à jour plusieurs propriétés à des fins de débogage.

post_install do |installer|
  installer.pods_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.pods_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

La réponse acceptée à partir de maintenant ne fonctionne pas pour les pods SWIFT. Voici une modification d'une ligne à cette réponse qui semble fonctionner pour les deux.

    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

Je pense que la réponse acceptée ne me convient pas. config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'DEBUG=1']

||= est utilisé pour affecter une variable vide ou nulle, mais si le config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] n'est pas vide ?

Le tableau ne peut pas du tout être modifié.La valeur est ["POD_CONFIGURATION_PRODUCTION=1", "$(inherited)"] pour moi.

J'ai donc donné la réponse complète.

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 

||= [] assurez-vous que la variable est un tableau valide.et arrayA |= arrayB signifie arrayA + arrayB et débarrassez l'élément répété, puis revenez à arrayA.

Encore plus simple :assurez-vous simplement d'avoir le DEBUG=1 macro à votre GCC_PREPROCESSOR_DEFINITIONS dans votre projet dans xCode pour le mode débogage mais pas le mode release.Si vous l'ajoutez au niveau du projet (pas de cibles spécifiques), il sera hérité par toutes les cibles (test de débogage, cibles personnalisées, etc.).Ceci est défini par défaut sur les nouveaux projets et est généralement attendu.Si vous le manquez, cela pourrait avoir un impact considérable.

Si cela ne fonctionne toujours pas, assurez-vous d'avoir également $(inherited) dans toutes vos cibles pour GCC_PREPROCESSOR_DEFINITIONS.CocoaPods et DEBUG comptent tous deux sur cela.

settings

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top