-
Notifications
You must be signed in to change notification settings - Fork 393
Available Symbols Generators
Inside the template.json file, you can define custom symbols that will be used inside the template files.
The supported symbol types are:
- Parameter - the value is typically provided by the user when creating the template. If not provided, the value is taken from host configuration, otherwise default value is used.
- Derived - defines transformation of another symbol. The value of this symbol is derived from the value of another symbol by applying the defined form.
- Computed - the boolean value is evaluated during the processing of the template based on the other symbol values.
- Generated - the value is computed by a built-in symbol value generator. There are no restrictions on symbol order: e.g. generated/computed/derived symbols can be used in any type of other symbols. The only rule is in avoiding circular dependencies such as:
"symbols": {
"switchCheck": {
"type": "generated",
"generator": "switch",
"datatype": "string",
"parameters": {
"evaluator": "C++",
"cases": [
{
"condition": "(switchCheck2 == 'regions')",
"value": "regions"
}
]
}
},
"switchCheck2": {
"type": "generated",
"generator": "switch",
"datatype": "string",
"parameters": {
"evaluator": "C++",
"cases": [
{
"condition": "(switchCheck == 'regions')",
"value": "regions"
}
]
}
} This article covers available generators for generated symbols.
To use a generated symbol inside your template.json file:
- Add
"type": "generated"to the symbol definition - Use the
"generator": ...parameter to select the generator to use.
This is a sample of definition of a generated symbol, theportgenerator, that generates a random number for an http port.
"IISExpressPortGenerated": {
"type": "generated",
"generator": "port",
"parameters": {
"fallback":"5000"
}
}, Most of the generators need to be configured via parameters that let you select the source of the data and select among the options available. Below is a sample of a symbol that use the now generator to replace a fixed year indication present in the source files with the current year.
"copyrightYear": {
"type": "generated",
"generator": "now",
"replaces": "1975",
"parameters": {
"format": "yyyy"
}
},Available built-in generators for computing generated symbols values are:
| Name | Description |
|---|---|
| casing | Enables changing the casing of a string. |
| coalesce | Behaves like the C# ?? operator. |
| constant | Constant value |
| port | Generate a port number that can be used by web projects. |
| guid | Create a new guid. |
| now | Get the current date/time. |
| random | Generate random int. |
| regex | Process a regular expression. |
| regexMatch | Checks if the value matches the regex pattern. |
| switch | Behaves like a C# switch statement. |
| join | Concatenates multiple symbols or constants. |
Changes the case of the text of the source value to all upper-case or all lower-case. It does not affect spaces (i.e. does not do any sort of Camel Casing).
| Name | Data Type | Description | Mandatory |
|---|---|---|---|
source |
string |
The name of symbol to use as the source of data. | yes |
toLower |
bool |
applies lower case if true, upper case otherwise |
no |
In this sample three symbols are defined:
-
ownerNameis a parameter which can be set on the command line usingdotnet newIt has a default value of "John Doe", that will be used if the no value is received from the host. The value will be used to replace "John Smith (a)". -
nameUpperandnameLowerare the symbols that generate the upperCase and lowerCase version ofownerNamethat are used to replace any instance of "John Smith (U)" and "John Smith (l)".
"symbols":{
"ownerName":{
"type": "parameter",
"datatype":"text",
"replaces": "John Smith (a)",
"defaultValue": "John Doe"
},
"nameUpper":{
"type": "generated",
"generator": "casing",
"parameters": {
"source":"ownerName",
"toLower": false
},
"replaces":"John Smith (U)"
},
"nameLower":{
"type": "generated",
"generator": "casing",
"parameters": {
"source":"ownerName",
"toLower": true
},
"replaces":"John Smith (l)"
}
}Behaves like the C# ?? operator. Note: the empty string value and default value of value type is treated as null.
The typical use of this generator is to check if the parameter was provided by user, otherwise set fallback generated value.
| Name | Data Type | Description | Mandatory |
|---|---|---|---|
sourceVariableName |
string |
the symbol name which is a primary source of data (left operand of coalesce) |
yes |
fallbackVariableName |
string |
the symbol name which is an alternate source of data(right operand of coalesce) |
yes |
defaultValue |
string |
The default value. In case it is specified, and primary source is equal to this value, the fallback value will be used. | no |
In this sample three symbols are defined:
-
MessageYear- is a parameter set by the user when callingdotnet new. -
ThisYear- use the now generator to calculate the current year. -
YearReplacer- ensures that any occurrence of "1234" is replaced. IfMessageYearwas passed in by the user that value will be used. OtherwiseThisYearwill be used.
"symbols":{
"MessageYear":{
"type": "parameter",
"datatype":"int"
},
"ThisYear":{
"type": "generated",
"generator": "now",
"parameters": {
"format": "yyyy"
}
},
"YearReplacer": {
"type": "generated",
"generator": "coalesce",
"parameters": {
"sourceVariableName": "MessageYear",
"fallbackVariableName": "ThisYear"
},
"replaces": "1234"
}
}Uses constant value.
| Name | Data Type | Description | Mandatory |
|---|---|---|---|
value |
string |
constant value | yes |
myConstant is a symbol that replaces "1234" with "5001"
"symbols":{
"myConstant": {
"type": "generated",
"generator": "constant",
"parameters": {
"value":"5001"
},
"replaces":"1234"
}
}Gets an available port number on the machine.
During evaluation looks for a valid free port number trying to create a socket, and in case of problems, returns the value defined in the fallback parameter.
| Name | Data Type | Description | Mandatory |
|---|---|---|---|
high |
integer |
defined the high bound of range to select port from. The maximum value is 65535. If greater value is specified, 65535 is used instead. |
no, default: 65535
|
low |
integer |
defined the low bound of range to select port from. The minimum value is 1024. If less value is specified, 1024 is used instead. |
no, default: 1024
|
fallback |
integer |
fallback value | no, default: 0
|
Note: if low > high, the default values for low and high are used: 1024 - 65535.
The following ports are reserved:
- 1719 - H323 (RAS)
- 1720 - H323 (Q931)
- 1723 - H323 (H245)
- 2049 - NFS
- 3659 - apple-sasl / PasswordServer [Apple addition]
- 4045 - lockd
- 4190 - ManageSieve [Apple addition]
- 5060 - SIP
- 5061 - SIPS
- 6000 - X11
- 6566 - SANE
- 6665 - Alternate IRC [Apple addition]
- 6666 - Alternate IRC [Apple addition]
- 6667 - Standard IRC [Apple addition]
- 6668 - Alternate IRC [Apple addition]
- 6669 - Alternate IRC [Apple addition]
- 6679 - Alternate IRC SSL [Apple addition]
- 6697 - IRC+SSL [Apple addition]
- 10080 - amanda
In this sample KestrelPortGenerated is a symbol that return the number of an available port or 5000.
"KestrelPortGenerated": {
"type": "generated",
"generator": "port"
"parameters": {
"fallback":"5000"
}
},Note: Guids section in template.json can be used to achieve same goals with easier configuration
Creates a formatted guid for a replacement. To configure the output format of the macro you can use the defaultFormat parameter that accepts a single value from {'n', 'd', 'b', 'p', 'x'} for lowercase output or {'N', 'D', 'B', 'P', 'X'} for uppercase output. The formats are defined in Guid.ToString() method documentation
| Name | Data Type | Description | Mandatory |
|---|---|---|---|
defaultFormat |
string |
format descriptor | no, default: D
|
This sample creates different symbols showing the different formatting available for the generated guid.
"symbols":{
"id01":{
"type": "generated",
"generator": "guid",
"replaces": "myid01",
"parameters": {
"defaultFormat":"N"
}
},
"id02":{
"type": "generated",
"generator": "guid",
"replaces": "myid02",
"parameters": {
"defaultFormat":"D"
}
},
"id03":{
"type": "generated",
"generator": "guid",
"replaces": "myid03",
"parameters": {
"defaultFormat":"B"
}
},
"id04":{
"type": "generated",
"generator": "guid",
"replaces": "myid04",
"parameters": {
"defaultFormat":"P"
}
},
"id05":{
"type": "generated",
"generator": "guid",
"replaces": "myid05",
"parameters": {
"defaultFormat":"X"
}
}
}Implementation class
Guid Format Documentation
Guids section in template.json
Creates a symbol from the current date/time.
| Name | Data Type | Description | Mandatory |
|---|---|---|---|
format |
string |
DateTime.ToString() format |
no |
utc |
bool |
UTC time if true, local time otherwise |
no |
In this sample a symbol is created showing the current data, and replacing any instance of "01/01/1999"
"symbols":{
"createdDate": {
"type": "generated",
"generator": "now",
"parameters": {
"format": "MM/dd/yyyy"
},
"replaces":"01/01/1999"
}
}Implementation class
DateTime.ToString documentation
Sample
Creates a random integer value in a specified range.
| Name | Data Type | Description | Mandatory |
|---|---|---|---|
low |
integer |
lower inclusive bound | yes |
high |
integer |
upper exclusive bound | no, default:int.MaxValue
|
This sample shows a symbol that generates a value from 0 to 10000 excluded, and replace any instance of 4321
"symbols":{
"myRandomNumber":{
"type": "generated",
"generator": "random",
"parameters": {
"low": 0,
"high": 10000
},
"replaces": "4321"
}
}Defines a list of data manipulation steps based on regex expressions.
| Name | Data Type | Description | Mandatory |
|---|---|---|---|
source |
string |
the symbol to transform | yes |
steps |
array |
replacement steps | yes |
steps element definition:
| Name | Data Type | Description | Mandatory |
|---|---|---|---|
regex |
string, regex pattern |
selection pattern | yes |
replacement |
string |
the replacement value for matched pattern | yes |
"symbols": {
"regexExample": {
"type": "generated",
"generator": "regex",
"dataType": "string",
"replaces": "A different message", //The value to replace in the output
"parameters": {
"source": "message", //The name of the symbol whose value should be operated on
"steps": [
{
"regex": "^test", //The regular expression whose matches will be replaced with '[Replaced]`
"replacement": "[Replaced]" //The value to replace matches of the expression '^test' with
},
{
"regex": "test$",
"replacement": "[/Replaced]"
}
]
}
}
}Implementation class
RegEx.Replace Documentation
Tries to match regex pattern against value of source symbol and returns true if matched, otherwise false.
| Name | Data Type | Description | Mandatory |
|---|---|---|---|
source |
string |
the symbol to attempt to match value | yes |
pattern |
string, regex pattern |
the regex match pattern | yes |
"symbols": {
"isMatch": {
"type": "generated",
"generator": "regexMatch",
"dataType": "bool",
"replaces": "test.value1",
"parameters": {
"source": "name",
"pattern": "^hello$"
}
}
}Implementation class
Regex.IsMatch Documentation
Defines a set of conditions to be evaluated, and the value to return if the condition is met. The first condition to evaluate to true is used. To include a default case, add a condition that always evaluates to true as the last entry in cases.
| Name | Data Type | Description | Mandatory |
|---|---|---|---|
cases |
array |
choices to evaluate | yes |
evaluator |
enum: C++2, C++, MSBuild, VB
|
expression evaluation engine | no, default: C++2
|
cases definition
| Name | Data Type | Description | Mandatory |
|---|---|---|---|
condition |
string |
the condition to evaluate, keep empty for default clause. | no |
value |
string |
the value to return, if condition evaluates to true
|
yes |
This sample shows how to change the replacement value based on evaluating conditions using other symbols:
"symbols": {
"test": {
"type": "parameter",
"datatype": "string"
},
"example": {
"type": "generated",
"generator": "switch",
"replaces": "abc",
"parameters": {
"evaluator": "C++",
"datatype": "string",
"cases": [
{
"condition": "(test == '123')",
"value": "456"
},
{
"condition": "(test == '789')",
"value": "012"
}
]
}
}
}In this case, if the user enters the value 123 as the value of the parameter test, abc in the content will be replaced with 456, if the user enters 789, abc is replaced with 012 instead.
Concatenates multiple symbols or constants with the defined separator into a new symbol.
| Name | Data Type | Description | Mandatory |
|---|---|---|---|
symbols |
array |
defines the values to concatenate | yes |
separator |
string |
the value used as the separator between the values to be concatenated, notice that you can use / as folder separator also on Windows, since File API will convert it into \
|
no |
removeEmptyValues |
bool |
indicates whether the empty values should be skipped or honored. By default this switch is off - leading to multiple consecutive separators in output string in case that same input values are null or empty | no |
symbols definition
| Name | Data Type | Description | Mandatory |
|---|---|---|---|
type |
enum: ref, const
|
ref indicates that the value is referenced from another symbol const - the value is a string constant |
no, default: const
|
value |
string |
either a name of another symbol or string constant | yes, should be not empty or whitespace when type is ref
|
This sample shows how to change the replacement value based on evaluating conditions using other symbols:
"symbols": {
"company": {
"type": "parameter",
"dataType": "string",
"defaultValue": "Microsoft"
},
"product": {
"type": "parameter",
"dataType": "string",
"defaultValue": "Visual Studio"
},
"joinedRename": {
"type": "generated",
"generator": "join",
"fileRename": "Api",
"parameters": {
"symbols": [
{
"type": "const",
"value": "Source"
},
{
"type": "const",
"value": "Api"
},
{
"type": "ref",
"value": "company"
},
{
"type": "ref",
"value": "product"
}
],
"separator": "/",
"removeEmptyValues": true
}
}
}This sample will rename folder called Api into Source/Api/Microsoft/Visual Studio. Notice that File API will automatically change / into \ on Windows.
Joining multi-choice symbol values:
template.json:
"symbols": {
"Platform": {
"type": "parameter",
"description": "The target framework for the project.",
"datatype": "choice",
"allowMultipleValues": true,
"choices": [
{
"choice": "Windows",
"description": "Windows Desktop"
},
{
"choice": "WindowsPhone",
"description": "Windows Phone"
},
{
"choice": "MacOS",
"description": "Macintosh computers"
},
{
"choice": "iOS",
"description": "iOS mobile"
},
{
"choice": "android",
"description": "android mobile"
},
{
"choice": "nix",
"description": "Linux distributions"
}
],
"defaultValue": "MacOS|iOS"
},
"joinedRename": {
"type": "generated",
"generator": "join",
"replaces": "SupportedPlatforms",
"parameters": {
"symbols": [
{
"type": "ref",
"value": "Platform"
}
],
"separator": ", ",
"removeEmptyValues": true,
}
}
}Program.cs:
// This file is generated for platfrom: SupportedPlatformsThis sample will expand and join values of Platform argument and replace SupportedPlatforms string with MacOS, iOS:
Program.cs:
// This file is generated for platfrom: MacOS, iOS