Firma Apple zapewniła pełną obsługę flag preprocesora Swift od Xcode 8 , więc nie jest już konieczne ustawianie tych wartości w „Inne flagi Swift”.
Nowe ustawienie nosi nazwę „Aktywne warunki kompilacji” i zapewnia obsługę na najwyższym poziomie odpowiednika flag preprocesora w języku Swift. Używasz go w dokładnie taki sam sposób, jak „Inne flagi Swift”, z wyjątkiem tego, że nie ma potrzeby poprzedzania wartości znakiem „-D” (więc jest to trochę czystsze).
Z informacji o wersji Xcode 8 :
Active Compilation Conditions
to nowe ustawienie kompilacji do przekazywania flag kompilacji warunkowej do kompilatora Swift. Każdy element wartości tego ustawienia przechodzi do swiftc z prefiksem -D
, w taki sam sposób, w jaki elementy Preprocessor Macros
pass to clang z tym samym prefiksem. (22457329)
Używasz powyższego ustawienia w następujący sposób:
#if DEBUG
let accessToken = "DebugAccessToken"
#else
let accessToken = "ProductionAccessToken"
#endif
=1
... Straciłem trochę czasu, próbując dowiedzieć się, dlaczego to nie działa kiedy to zrobiłem. Więc pomyślałem, że podzielę się tą ciekawostką, aby pomóc następnemu facetowi. :] W każdym razie, dzięki za odpowiedź tutaj!DEBUG
in jakActive Compilation Conditions
iDEBUG=1
inPreprocessor Macros
i ta konfiguracja w ogóle nie działa. Czy powinienem usunąćDEBUG=1
? Nie wynika to z powyższych komentarzy.Build Configuration
. Więcej informacji znajdziesz w tej odpowiedzi stackoverflow.com/questions/9063100/… .AKTUALIZACJA: Xcode 8 obsługuje teraz to automatycznie, zobacz odpowiedź @ DanLoewenherz powyżej.
Przed Xcode 8 nadal można było używać makr w ten sam sposób:
#if DEBUG let apiKey = "KEY_A" #else let apiKey = "KEY_B" #endif
Aby jednak zostały one odebrane przez Swifta, musisz ustawić „Inne flagi szybkiej” w ustawieniach budowy celu:
-D
flagąźródło
-D
przedrostkaJako dalsza obserwacja, staraj się nie przechowywać kluczy / kluczy interfejsu API w zwykłym tekście w repozytorium. Użyj systemu zarządzania sekretami, aby załadować klucze / sekrety do zmiennych środowiskowych użytkownika. W przeciwnym razie krok 1 jest konieczny, jeśli jest akceptowalny.
../set_keys.sh
który zawiera listęexport API_KEY_A='<plaintext_key_aef94c5l6>'
(użyj pojedynczego cudzysłowu, aby zapobiec ocenie)source ../set_keys.sh
i przenieś ją na górę kolejności wykonaniaAPI_KEY_A="$API_KEY_A"
To przechwytuje zmienną środowiskową do definicji kompilatora, która jest później używana w każdym wywołaniu clang dla każdego pliku źródłowego.
Przykładowa struktura katalogów
[10:33:15] ~/code/memo yes? tree -L 2 . . ├── Memo │ ├── Memo │ ├── Memo.xcodeproj │ ├── Memo.xcworkspace │ ├── Podfile │ ├── Podfile.lock │ └── Pods └── keys
źródło
W szybkich pakietach musisz to zrobić wewnątrz
swiftSettings
argumentu do.target
w swoimPackage.swift
pliku. Użyjdefine
metody (dokumentacja Apple) lub dokumentacji Swifttargets: [ .target(name: String, dependencies: [Target.Dependency], path: String?, exclude: [String]?, sources: [String]?,, cSettings: [CSetting]?, cxxSettings: [CXXSetting]?, swiftSettings: [SwiftSetting]?, linkerSettings: [LinkerSetting]?),
Mój wygląda tak i działa!
swiftSettings: [ .define("VAPOR") ]
w moim kodzie mogę warunkowo skompilować za pomocą tego:
#if VAPOR
źródło