This is part 4 of a 4 part series of posts
- Part 1 – Getting Started
- Part 2 – Optional Files.
- Part 3 – Optional Code/Content
- Part 4 – Visual Studio Support
In the previous posts in this series we have explored how to set up a project as a template and the basics of the new templating system, how to optionally include/exclude files, and finally how to handle optional content within various files in the project. In this final post we’ll take a look at how to add support for your template in Visual Studio so that users of your template can also use the template from within the IDE itself.
The first thing we need to do is enable support within Visual Studio’s options for third party templates. To do that we need to open up the options using the menus – Tools | Options and then expand Environment to find Preview Features and enable Show all .Net Core templates in the New project dialog (requires restart).
Next we’ll add a couple of items to the template.json file. Immediately after shortname we’ll add defaultName (This drives the default name Visual Studio will generate for a new project) and description (Which will show up under your project type name in the dialog) and the Framework section under symbols (Which will drive the frameworks selection drop down in the additional properties dialog).
{ ... "shortName": "ninjamvc", "defaultName": "DotNetNinjaMVC", "description": ".Net 5.0 MVC Web Application - Batteries Included", ... "symbols": { "Framework":{ "type": "parameter", "description": "The target framework for the project.", "datatype": "choice", "choices": [ { "choice": "net5.0", "description": ".Net 5.0" } ], "replaces": "net5.0", "defaultValue": "net5.0" }, "ReadMe": { "type": "parameter", "datatype":"bool", "defaultValue": "true", "description": "Include a Read Me file (ReadMe.md) in the solution." }, ... }
With that done we need to add a new file named ide.host.json to our .template.config folder which should be located @ ~\src\Content\.template.config. This file will allow us to set up all of our command line options to show up as check-boxes in the new project dialogs within Visual Studio.
{ "$schema":"http://json.schemastore.org/vs-2017.3.host", "symbolInfo": [ { "id": "ReadMe", "name": { "text": "Include a Read Me file (ReadMe.md) in the solution." }, "isVisible": "true" }, { "id": "License", "name": { "text": "Include an MIT License file (License.txt) in the solution." }, "isVisible": "true" }, { "id": "GitIgnore", "name": { "text": "Include a Git Ignore file (.gitignore) in the solution." }, "isVisible": "true" }, { "id": "EditorConfig", "name": { "text": "Include an Editor Config file (.editorconfig) in the solution." }, "isVisible": "true" }, { "id": "Authentication", "name": { "text": "Include code integrating Auth0 authentication in the solution." }, "isVisible": "true" } ] }
The first item in the file sets the schema of the json and enables intellisense in Visual Studio & VS Code when editing the file which is very handy. The rest of the file is an array of elements that map to the elements for our parameters in the template.json file and provide information for Visual Studio to be able to display these options in the dialogs.
- id: maps to the name of the argument in the template.json file.
- name: maps to the text that will be displayed withing Visual Studio along side the check box for the option.
- isVisible: makes the option visible in the IDE.
I’ve also updated my Test-Template.ps1 file to add in the following snippet which will clear the template cache used by Visual Studio as well so that changes to the template appear in Visual Studio when the template is reinstalled during testings.
Remove-Item ~/.templateengine -Recurse -Force
Also note that I have updated the names of the options from my initial posts (changed the casing).
With all those changes we should now be able to test our template. Run the test-template.ps1 file to clear the cache, build and reinstall the template and then launch Visual Studio. You should now see that the template is available and when you use it you should be presented with dialogs that allow you to enable/disable all of the feature.
That ends this series of posts on creating templates, but we have really only scratched the surface of what can be done with the template engine. Check out the resources below for more information. You can also checkout the completed source code for my template on GitHub.
Resources
- How to create your own templates for dotnet new – Sayed Hashmi
- Custom templates for dotnet new – MIcrosoft Docs