picknroll
Keep environment specific attributes in separate configuration files and build desired config on demand.
npm i pick-and-roll
The package is port from ruby https://github.com/DimaSalakhov/picknroll
The problem
Michael and Scotty work on the same website. Michael use url "http://localhost", Scotty - "http://website". Configuration lives in repository.
Basically guys have to options:
- store 2 configuration files and duplicate common settings
- manually change url setting after checkout
Their problems may be overcome with the following solution:
- Keep common settings in configuration file
- Separate distinct settings to custom files: Michael.json and Scotty.json respectively
- Build configuration result configuration file based on common and custom files on demand
Config splitting
Web.config:
<configuration>
<appSettings>
<add key="Language" value="@@language@@" />
<add key="BaseUri" value="@@baseurl@@" />
</appSettings>
</configuration>
config.json
{ "language":"C#" }
Michael.json:
{ "baseuri":"http://localhost" }
Scotty.json:
{
"language":"Ruby"
"baseuri":"http://website"
}
where config.json accumulates settings which is true for the majority, but should be customizable
Usage
var PickAndRoll = require('pick-and-roll');
new PickAndRoll().go()
will look for config.json and .json file as custom config
or
var PickAndRoll = require('pick-and-roll');
new PickAndRoll({configFile: 'Scotty'}).go()
will look for config.json and execute with Scotty.json file as custom config, overriding language setting
Configuration
All configuration files are in json format, process can be configured with .parconfig file:
{
"customDir": "_configs",
"config": "config.json",
"files": [
"app.generic.xml",
"web.config"
]
}
customDir - path to directory with configuration files (default: _configs) config - path to file with common settings (default: config.json; expected to be placed inside customDir) files - array of files to be parsed. If filename contain ".generic.", then new file without slug will be generated, otherwise values will be substituted in original file.
Example
.parconfig:
{
"files": [
"app.generic.xml",
"web.config"
]
}
Web.generic.xml:
<configuration>
<add key="BaseUri" value="@@baseurl@@" />
</configuration>
App.config:
<configuration>
<add key="uri" value="@@baseurl@@" />
</configuration>
config.json:
{ "baseuri":"http://domain.name" }
Michael.json:
{ "baseuri":"http://localhost" }
If we run PickAndRoll on PC called Michael we'll get
web.generic.xml - untouched web.xml:
<configuration>
<add key="BaseUri" value="http://localhost" />
</configuration>
App.config:
<configuration>
<add key="uri" value="http://localhost" />
</configuration>