Visual Studio 2013 Database Project: Database Item Templates with VSIX
Strictly speaking VSIX is not a database project or related in kind, but by virtue of Item Templates. With VSIX projects and the TemplateBuilder (NuGet) package, templates can be built from the contents of an ItemsTemplates folder. The latter (if not created by TemplateBuilder) should be manually created as ItemTemplates folder as an item of the VSIX project.
NOTE: SQL Server (database) templates are not supported in Visual Studio 2013 VSIX and requires a manual effort to install on a developer’s IDE. As indicated by the error item below, if the database files added to a VSIX project are changed to have a vstemplate file extension the compiler (on build) should issue this error saying that only CSharp and VBasic templates. Similarly if a Reference is added in the Asset tab of the manifest, the error The targer “TemplateProjectOuputGroup” does not exist in the project” is presented.
The VSIX project template is available from the Visual Studio 2013 SDK and found under the menu: [Visual C#] >> Extensibility >> VSIX Project.
The TemplateBuilder package is installed from the Package Manager console or from Visual Studio: Tools >> NuGet Package Manager >> Package Manger Console. Once installed, template are built to the folder: <Drive:>:\Users\<User>\Documents\Visual Studio 2013\Templates\ItemTemplates and <Drive:>\Users\<User>\Documents\Visual Studio 2013\Templates\ProjectTemplates.
NuGet Package Manager
Download and install the NuGet Package Manager for Visual Studio 2013. It has a VSIX extension but installs by double-click and run.
SideWaffle is a template pack that adds a selection of project and item templates to Visual Studio, including enabling templates to use for creating new ones. A VSIX project generates an experimental invocation of Visual Studio in which to test these templates so that the real instance is not affected. To configure templates require a work-flow that is enabled by a separate application (that you create) to populate template and custom parameters when creating a new item. This article, for now, mentions it but is not using it to create templates.
Create a New VSIX Project for Template Deployment
In order to author customised solutions, projects, code-snippets, and templates, a VSIX project is required. Depending on the user-environment set-up for Visual Studio, file paths may vary slightly.
Create a new project:
- Follow the path: File >> New Project >> [Custom Path] >> [Visual C#] >> extensibility >> VSIX Project
- Provide a name for the project and check the solution details
- Fill out the VS VSIX Manifest with the appropriate details (reference)
- Install the TemplateBuilder package.
This installation requires the Package Manager Console (NuGet):
- Follow the path: Tools >> NuGet Package Manager >> Package Manager Console.
- Type Install-Package TemplateBuilder -Pre at the PM> prompt and hit [Enter]. NOTE: Internet access to https://www.nuget.org/api/v2/ is required.
The TemplateManager installation responds favourably on completion of the install, if it succeeds. NOTE: The NuGet package is downloaded into the file location: <Drive>:\Users\<user name>\AppData\Local\NuGet\Cache and in the event of not having the default Internet location (https://www.nuget.org/api/v2/) available, Visual Studio looks here for whatever the package is being installed.
The installation process deposits an example template into: <Drive:>\Users\<User>\Documents\Visual Studio 2013\Templates\ProjectTemplates. NOTE: there may not actually be an example template in this folder.
Create a Template Solution and Project
The Visual Studio Solution should contain the VSIX project as well as other projects, i.e. those used in which to create the templates. For example, to create database templates a database project is added to the solution and the corresponding templates with parameters created in there. This article uses the template created in a previous post (Visual Studio 2013 Database Project: Create a Stored Procedure Item Template) to illustrate how the VSIX project functions in this respect.
There are two methods:
- Exporting and importing a template (zip file)
- Referencing the template source project from the VSIX project where they are in the same solution
The latter (point 2) does not work for database templates
Exporting the Template
The template (or stored procedure created in the templates project) is created by exporting the necessary file (the actual stored procedure and any referenced files in the case of a project or c# type template) to the folder: <Drive:>\Users\<User>\Documents\Visual Studio 2013\My Exported Templates. Follow the next steps to affect this:
- Create, for example a stored procedure template (reference the above link on how to do that) an File >> Export Template >> Item Template, select the correct project, i.e. the database project containing the stored procedure created.
- Select the correct stored procedure and complete the wizard. The output template is locatable in the folder: <Drive:>\Users\<User>\Documents\Visual Studio 2013\My Exported Templates in a file called: <Template Name>.zip.
NOTE: Edit the MyTemplate.vstemplate file (contained inside the zip file) in Visual Studio and add an element TemplateGroupID (depicted in the code below) between the templateData tags to help with the filtering of template in the New Item dialog (reference).
The Item Template (Stored Procedure) is added to the VSIX project. Use the .vsixmanifest file and add an Itemtemplate item to the Assets tab. Add a:
- New item,
- Pick ItemTemplate and
- Point the File Location to the folder where the copied template zip file has been placed.
NOTE: The path could be: :\Users\\Documents\Visual Studio 2013\Templates\ItemTemplates\\Database\Programmability, but it is up to choice. However, Visual Studio, on starting up, reads from this location on a user-instance, i.e. local machine. The project is appended with a new folder, i.e. ItemTemplates and the zip file is appended.
On the the property of the newly added template (zip) file, set the property Copy to Output Directory is set tot Copy Always.
NOTE: To inspect the XML code of the project file: right-click >> Remove and then right-click >> edit) reveals this setting in its XML structure, as depicted below.
NOTE: Turn off the Build and Deploy options in the Configuration Manager for the VSIX project.
Using a Reference to the Template Project in the same Solution
A reference to the template project (the one where the stored procedure is authored) is added to the Reference of the VSIX project by using the source.extension.vsixmanifest file’s Assets tab, as before. But, in this case, the reference is to a project in the same solution. The fields [Type],
[Source], and [Project] are completed, with project being the name of the said template project. This adds a reference to the VSIX project.
Set the Properties of the reference (see how), especially the VSIX Sub Path that determines where the template is installed on the menu-tree of the New Item menu function.
NOTE: Visual Studio does not provide a project template for creating database objects, so it seems the export method is the only way in which to get the zip file into the VSIX for deployment. This aspect may be resolvable by creating the zipped files in a database project and let the project zip them like the wizard and place in the appropriate folder. Not yet sure how to do this.
Build the Project and Install the Templates
The VSIX project is built and it copies the template zip file to the output folder: \Users\\Documents\Visual Studio 2013\Projects\\\bin\Debug as a .vsix (installable) file along with a TemplateBuilder.dll and the folder structure (Visual Studio) that contains the actual template file.
NOTE: For developer projects, this installation file should be made available on a network shared drive and installed as updates are made, or from a Private Gallery reference) that notifies users via RSS feeds of new extensions. Alternatively the same file can be uploaded to the Visual Studio Gallery for community consumption and addition.
file in the VSIX project to set the [Assets] by creating a new reference to an ItemTemplate of a project (the one containing the stored procedure template) that also adds it to the References of the VSIX project. Here the Properties of the added assembly can be altered to achieve a variety of things. See the screen image (below) for a visual explanation of what is described.
Executing the <Name>.vsix (installable) file invokes all the things that were set in the manifest to install the template(s). These are available in Visual Studio and can be inspected via: Tools >> Extensions & Updates >> Templates
, illustrated below.
Using the newly installed Templates
After installing the VSIX template package and verifying the extension is in Visual Studio, the template can be used from which to create Projects or Items. During the installation the templates are deployed to a random folder: %LocalAppData%\Microsoft\VisualStudio\12.0\Extensions and by virtue of %LocalAppData% it only applies to the current user. Alternatively, setting the manifest to AllUsers=true the extension is installed under Common7\IDE\Extensions (where VS is installed) and appears to all users on the computer (reference).