BuildConfig.swift
BuildConfig.swift is a tool to generate configuration files by merging yamls or jsons.
By splitting the file for each type of setting, it is possible to prevent conflicts of configuration files.
Also, by splitting the file for environment configurations, it will be easier to overwrite configurations for each environment.
Example
Base JSON file
{
"API": {
"domain": "http://localhost",
"path": {
"login": {
"method": "POST",
"path": "/login"
},
"getList": {
"method": "GET",
"path": "/list"
}
}
}
}
Call above configuration
Vanilla
let file = Bundle.main.path(forResource: "Base", ofType: "json")!
let data = try! Data(contentsOf: URL(fileURLWithPath: filePath))
let config = try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
let api = config["API"] as! [String: Any]
let domain = api.domain as! String // "http://localhost"
let loginPath = (api.path as! [String: Any])["login"] as! [String: Any]
let path = loginPath.path // "/login"
let method = loginPath.method // "POST"
Using BuildConfig.swift
let config = BuildConfig.default
let domain = config.API.domain // "http://localhost"
let path = config.API.path.login.path // "/login"
let method = config.API.path.login.method // "POST"
Installation
Common
- Create directory for splitted configuration files, e.g.
$PROJECT/Resources/Config
. - If you use different settings for each environment, create
.env
into above directory. - You don't have to add above directory into project.
CocoaPods
- Add the following line to your test target in your Podfile:
pod 'BuildConfig.swift'
- Add the following
Run script
build phase to your test target'sBuild Phases
:
Example
if [ "${CONFIGURATION}" = 'Release' ]; then
ENVIRONMENT='production'
else
ENVIRONMENT='staging'
fi
"${PODS_ROOT}/BuildConfig.swift/buildconfigswift" -e $ENVIRONMENT "$SRCROOT/$PROJECT/Resources/Config"
You can replace "$SRCROOT/$PROJECT/Resources/Config"
to the relative path from project to the directory you created.
Also, you can add -o
option with output path to specify where BuildConfig.plist
and BuildConfig.generated.swift
will be created.
-
Add
$(SRCROOT)/BuildConfig.generated.swift
intoOutput Files
in aboveRun script
build phase.- If you set a path to output generated files by
-o
option, you have to changeOutput Files
to it's path.
- If you set a path to output generated files by
-
Drag the new
Run Script
phase above theCompile Sources
phase and belowCheck Pods Manifest.lock
. -
Build your project, in Finder you will now see a
BuildConfig.generated.swift
in$SRCROOT
or a path you set with-o
option in aboveRun script
build phase. -
Drag them into your project.
Tip: Add the *.generated.swift
pattern to your .gitignore
file to prevent unnecessary conflicts.
Manually
TODO: Future support.
BuildConfig.swift
doing?
What is - Detect all yml/json files in
$SRCROOT/$PROJECT/Resources/Config
, exclude.env
. - If the
-e
option is set and a file with the same name as that option exists in$SRCROOT/$PROJECT/Resources/Config/.env
, only that file is read.
For example,-e staging
option means to read$SRCROOT/$PROJECT/Resources/Config/.env/staging.{yml/yaml/json}
. - Parse above files as
Swift.Dictionary
. - Deep merge the above dictionaries.
- Output merged dictionary as a plist file.
Libraries
License
Available under the MIT License.