Apple a inclus la prise en charge complète des indicateurs de préprocesseur Swift à partir de Xcode 8 , il n'est donc plus nécessaire de définir ces valeurs dans «Autres indicateurs Swift».
Le nouveau paramètre est appelé «Conditions de compilation actives», qui fournit une prise en charge de niveau supérieur pour l'équivalent Swift des indicateurs de préprocesseur. Vous l'utilisez exactement de la même manière que vous le feriez avec "Other Swift Flags", sauf qu'il n'est pas nécessaire de mettre la valeur avant "-D" (donc c'est juste un peu plus propre).
À partir des notes de version de Xcode 8 :
Active Compilation Conditions
est un nouveau paramètre de construction pour passer des indicateurs de compilation conditionnelle au compilateur Swift. Chaque élément de la valeur de ce paramètre passe à swiftc préfixé par -
D, de la même manière que les éléments de Preprocessor Macros
passe à clang avec le même préfixe. (22457329)
Vous utilisez le paramètre ci-dessus comme ceci:
#if DEBUG
let accessToken = "DebugAccessToken"
#else
let accessToken = "ProductionAccessToken"
#endif
=1
... j'ai perdu un peu de temps à essayer de comprendre pourquoi cela ne fonctionnait pas quand je l'ai fait. Alors, j'ai pensé partager cette information pour aider le prochain. :] Quoi qu'il en soit, merci pour votre réponse ici!DEBUG
dansActive Compilation Conditions
etDEBUG=1
enPreprocessor Macros
et cette configuration ne fonctionne pas du tout. Dois-je supprimerDEBUG=1
?? Pas clair d'après les commentaires ci-dessus.Build Configuration
. Consultez cette réponse stackoverflow.com/questions/9063100/… pour plus d'informations.MISE À JOUR: Xcode 8 prend désormais en charge cela automatiquement, voir la réponse de @ DanLoewenherz ci-dessus.
Avant Xcode 8, vous pouviez toujours utiliser les macros de la même manière:
#if DEBUG let apiKey = "KEY_A" #else let apiKey = "KEY_B" #endif
Cependant, pour qu'ils soient récupérés par Swift, vous devez définir "Autres indicateurs Swift" dans les paramètres de construction de votre cible:
-D
drapeaula source
-D
préfixeComme observation de suivi, essayez de ne pas conserver les clés / secrets d'API en texte brut dans le référentiel. Utilisez un système de gestion des secrets pour charger les clés / secrets dans les variables d'environnement de l'utilisateur. Sinon, l'étape 1 est nécessaire, si elle est acceptable.
../set_keys.sh
qui contient une liste deexport API_KEY_A='<plaintext_key_aef94c5l6>'
(utilisez un guillemet simple pour empêcher l'évaluation)source ../set_keys.sh
d'exécution de script qui peut et la déplacer vers le haut de l'ordre d'exécutionAPI_KEY_A="$API_KEY_A"
Cela capture la variable d'environnement dans la définition du compilateur qui est ensuite utilisée dans chaque appel de clang pour chaque fichier source.
Exemple de structure de répertoire
[10:33:15] ~/code/memo yes? tree -L 2 . . ├── Memo │ ├── Memo │ ├── Memo.xcodeproj │ ├── Memo.xcworkspace │ ├── Podfile │ ├── Podfile.lock │ └── Pods └── keys
la source
Dans les packages swift, vous devez le faire à l'intérieur de l'
swiftSettings
argument to.target
dans votrePackage.swift
fichier. Utilisez ladefine
méthode (documentation Apple) ou la documentation Swifttargets: [ .target(name: String, dependencies: [Target.Dependency], path: String?, exclude: [String]?, sources: [String]?,, cSettings: [CSetting]?, cxxSettings: [CXXSetting]?, swiftSettings: [SwiftSetting]?, linkerSettings: [LinkerSetting]?),
Le mien ressemble à ça et ça marche!
swiftSettings: [ .define("VAPOR") ]
dans mon code, je peux compiler conditionnellement en utilisant ceci:
#if VAPOR
la source