From c54f1809e4dc364481348efce97fc952bdf2db74 Mon Sep 17 00:00:00 2001 From: "Calvin A. Allen" Date: Wed, 7 Jan 2026 16:34:11 -0500 Subject: [PATCH 1/3] chore(sdk): remove unused template zipping, keep VsixTemplateReference - Remove VsixTemplateZip item type and related targets (VSSDK handles template packaging natively when Content entries are in manifest) - Keep VsixTemplateReference for cross-project templates (copies folders from referenced projects to local ProjectTemplates/ItemTemplates) - Add proper VSIXSubPath metadata so copied templates are placed at correct paths in the VSIX - Update E2E tests: remove PreBuiltZip, add Reference and ReferenceManual - Update workflow to verify new template reference tests - Update documentation to reflect simplified template handling Closes #39 --- .github/workflows/build.yml | 29 ++- docs/templates.md | 92 +++----- .../Sdk/Sdk.Vsix.Templates.props | 45 ++-- .../Sdk/Sdk.Vsix.Templates.targets | 217 +++++------------- .../E2E.AllFeatures/E2E.AllFeatures.csproj | 16 +- .../PreBuiltSource/PreBuiltProject/Class1.cs | 4 - .../E2E.Templates.PreBuiltZip.csproj | 46 ---- .../E2ETemplatesPreBuiltZipPackage.cs | 19 -- .../ItemTemplate/PreBuiltItem.vstemplate | 13 -- .../E2E.Templates.Reference.csproj | 32 +++ .../E2ETemplatesReferencePackage.cs | 11 + .../SharedTemplates}/ItemTemplate/Item.cs | 1 - .../ItemTemplate/RefItem.vstemplate | 12 + .../ProjectTemplate/Class1.cs | 0 .../ProjectTemplate}/Project.csproj | 1 + .../ProjectTemplate/RefProject.vstemplate} | 6 +- .../SharedTemplates/SharedTemplates.csproj | 18 ++ .../source.extension.vsixmanifest | 6 +- .../E2E.Templates.ReferenceManual.csproj | 31 +++ .../E2ETemplatesReferenceManualPackage.cs | 11 + .../SharedTemplates/ItemTemplate/Item.cs | 6 + .../ItemTemplate/RefItem.vstemplate | 12 + .../SharedTemplates/ProjectTemplate/Class1.cs | 6 + .../ProjectTemplate/Project.csproj | 3 +- .../ProjectTemplate/RefProject.vstemplate} | 10 +- .../SharedTemplates/SharedTemplates.csproj | 18 ++ .../source.extension.vsixmanifest | 24 ++ 27 files changed, 337 insertions(+), 352 deletions(-) delete mode 100644 tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/Class1.cs delete mode 100644 tests/e2e/E2E.Templates.PreBuiltZip/E2E.Templates.PreBuiltZip.csproj delete mode 100644 tests/e2e/E2E.Templates.PreBuiltZip/E2ETemplatesPreBuiltZipPackage.cs delete mode 100644 tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ItemTemplate/PreBuiltItem.vstemplate create mode 100644 tests/e2e/E2E.Templates.Reference/E2E.Templates.Reference.csproj create mode 100644 tests/e2e/E2E.Templates.Reference/E2ETemplatesReferencePackage.cs rename tests/e2e/{E2E.Templates.PreBuiltZip/TemplateSource => E2E.Templates.Reference/SharedTemplates}/ItemTemplate/Item.cs (60%) create mode 100644 tests/e2e/E2E.Templates.Reference/SharedTemplates/ItemTemplate/RefItem.vstemplate rename tests/e2e/{E2E.Templates.PreBuiltZip/TemplateSource => E2E.Templates.Reference/SharedTemplates}/ProjectTemplate/Class1.cs (100%) rename tests/e2e/{E2E.AllFeatures/PreBuiltSource/PreBuiltProject => E2E.Templates.Reference/SharedTemplates/ProjectTemplate}/Project.csproj (70%) rename tests/e2e/{E2E.AllFeatures/PreBuiltSource/PreBuiltProject/PreBuiltProject.vstemplate => E2E.Templates.Reference/SharedTemplates/ProjectTemplate/RefProject.vstemplate} (74%) create mode 100644 tests/e2e/E2E.Templates.Reference/SharedTemplates/SharedTemplates.csproj rename tests/e2e/{E2E.Templates.PreBuiltZip => E2E.Templates.Reference}/source.extension.vsixmanifest (73%) create mode 100644 tests/e2e/E2E.Templates.ReferenceManual/E2E.Templates.ReferenceManual.csproj create mode 100644 tests/e2e/E2E.Templates.ReferenceManual/E2ETemplatesReferenceManualPackage.cs create mode 100644 tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ItemTemplate/Item.cs create mode 100644 tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ItemTemplate/RefItem.vstemplate create mode 100644 tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ProjectTemplate/Class1.cs rename tests/e2e/{E2E.Templates.PreBuiltZip/TemplateSource => E2E.Templates.ReferenceManual/SharedTemplates}/ProjectTemplate/Project.csproj (62%) rename tests/e2e/{E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/PreBuiltProject.vstemplate => E2E.Templates.ReferenceManual/SharedTemplates/ProjectTemplate/RefProject.vstemplate} (54%) create mode 100644 tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/SharedTemplates.csproj create mode 100644 tests/e2e/E2E.Templates.ReferenceManual/source.extension.vsixmanifest diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d20ec3b..d75cbf9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -75,8 +75,11 @@ jobs: - name: Build E2E.Templates.AutoDiscovery run: dotnet build tests/e2e/E2E.Templates.AutoDiscovery/E2E.Templates.AutoDiscovery.csproj -c Release - - name: Build E2E.Templates.PreBuiltZip - run: dotnet build tests/e2e/E2E.Templates.PreBuiltZip/E2E.Templates.PreBuiltZip.csproj -c Release + - name: Build E2E.Templates.Reference + run: dotnet build tests/e2e/E2E.Templates.Reference/E2E.Templates.Reference.csproj -c Release + + - name: Build E2E.Templates.ReferenceManual + run: dotnet build tests/e2e/E2E.Templates.ReferenceManual/E2E.Templates.ReferenceManual.csproj -c Release - name: Build E2E.Templates.ManualWithSubPath run: dotnet build tests/e2e/E2E.Templates.ManualWithSubPath/E2E.Templates.ManualWithSubPath.csproj -c Release @@ -106,6 +109,28 @@ jobs: if ($files -notcontains "NewClass.vstemplate") { throw "Missing ItemTemplates/NewClass/NewClass.vstemplate" } Write-Host "E2E.Templates.AutoDiscovery VSIX verified successfully" + - name: Verify E2E.Templates.Reference VSIX + run: | + $vsix = "tests/e2e/E2E.Templates.Reference/bin/Release/net472/E2E.Templates.Reference.vsix" + if (!(Test-Path $vsix)) { throw "VSIX not found: $vsix" } + Expand-Archive -Path $vsix -DestinationPath "tests/e2e/E2E.Templates.Reference/vsix-contents" -Force + $files = Get-ChildItem -Path "tests/e2e/E2E.Templates.Reference/vsix-contents" -Recurse | Select-Object -ExpandProperty Name + # Verify templates copied from referenced project are included + if ($files -notcontains "RefProject.vstemplate") { throw "Missing ProjectTemplates/ProjectTemplate/RefProject.vstemplate" } + if ($files -notcontains "RefItem.vstemplate") { throw "Missing ItemTemplates/ItemTemplate/RefItem.vstemplate" } + Write-Host "E2E.Templates.Reference VSIX verified successfully" + + - name: Verify E2E.Templates.ReferenceManual VSIX + run: | + $vsix = "tests/e2e/E2E.Templates.ReferenceManual/bin/Release/net472/E2E.Templates.ReferenceManual.vsix" + if (!(Test-Path $vsix)) { throw "VSIX not found: $vsix" } + Expand-Archive -Path $vsix -DestinationPath "tests/e2e/E2E.Templates.ReferenceManual/vsix-contents" -Force + $files = Get-ChildItem -Path "tests/e2e/E2E.Templates.ReferenceManual/vsix-contents" -Recurse | Select-Object -ExpandProperty Name + # Verify templates copied from referenced project are included (manual manifest) + if ($files -notcontains "RefProject.vstemplate") { throw "Missing ProjectTemplates/ProjectTemplate/RefProject.vstemplate" } + if ($files -notcontains "RefItem.vstemplate") { throw "Missing ItemTemplates/ItemTemplate/RefItem.vstemplate" } + Write-Host "E2E.Templates.ReferenceManual VSIX verified successfully" + - name: Verify E2E.AllFeatures VSIX run: | $vsix = "tests/e2e/E2E.AllFeatures/bin/Release/net472/E2E.AllFeatures.vsix" diff --git a/docs/templates.md b/docs/templates.md index 7fef526..a3c8538 100644 --- a/docs/templates.md +++ b/docs/templates.md @@ -6,19 +6,27 @@ This document explains how to include Visual Studio project templates and item t The built-in VSIX Manifest Designer in Visual Studio cannot enumerate SDK-style projects when adding template assets. This is because the designer uses legacy DTE extenders that are registered for the old project system, not the Common Project System (CPS) used by SDK-style projects. -Additionally, SDK-style projects don't define the `TemplateProjectOutputGroup` and `ItemTemplateOutputGroup` MSBuild output groups that VSSDK expects for template assets. +This SDK provides MSBuild-based template support that works around these limitations by: +- Auto-discovering templates in standard folders +- Supporting cross-project template references +- Providing validation warnings for missing manifest Content entries -This SDK provides MSBuild-based template support that bypasses these limitations entirely. +## How It Works + +VSSDK (the Visual Studio SDK build tools) handles the actual template packaging when your manifest contains `` entries. This SDK provides: + +1. **Auto-discovery** of templates for validation +2. **Cross-project template references** for including templates from other SDK-style projects +3. **Validation warnings** if your manifest is missing required Content entries ## Item Types -The SDK provides four item types for including templates: +The SDK provides the following item types for templates: | Item Type | Description | |-----------|-------------| -| `VsixProjectTemplate` | A folder containing a `.vstemplate` file for a project template | -| `VsixItemTemplate` | A folder containing a `.vstemplate` file for an item template | -| `VsixTemplateZip` | A pre-built template zip file | +| `VsixProjectTemplate` | (Auto-discovered) A folder containing a `.vstemplate` file for a project template | +| `VsixItemTemplate` | (Auto-discovered) A folder containing a `.vstemplate` file for an item template | | `VsixTemplateReference` | Reference a template folder from another project | ## Auto-Discovery @@ -45,10 +53,12 @@ MyExtension/ MyClass.cs ``` -With this structure, no additional configuration is needed. The SDK will: +With this structure, minimal configuration is needed. The SDK will: 1. Find the templates automatically -2. Zip each template folder during build -3. Include the zips in the VSIX at `ProjectTemplates/` and `ItemTemplates/` +2. Warn if `` entries are missing from the manifest +3. VSSDK packages the templates into the VSIX + +You need to add the Content entries to your manifest manually (see Manifest Configuration below). ### Disabling Auto-Discovery @@ -71,33 +81,9 @@ To use different folder names: ``` -## Manual Template Configuration - -### Folder-Based Templates +## Cross-Project Template References -If your templates are in non-standard locations, add them explicitly: - -```xml - - - - -``` - -### Pre-Built Template Zips - -If you have pre-built template zip files: - -```xml - - - - -``` - -### Template References - -To include a template from another project in your solution: +When you have templates in a separate SDK-style project that the VSIX Manifest Designer cannot enumerate, use `VsixTemplateReference`: ```xml @@ -107,6 +93,10 @@ To include a template from another project in your solution: ``` +The SDK will: +1. Copy the template folder from the referenced project to your local `ProjectTemplates/` or `ItemTemplates/` folder +2. VSSDK will then discover and package it normally + The `TemplatePath` is relative to the referenced project's directory. ## Manifest Configuration @@ -120,24 +110,10 @@ Visual Studio requires `` entries in your `.vsixmanifest` to register t ``` -The SDK will emit warnings if you have templates defined but missing manifest entries: +The SDK will emit warnings if you have templates but missing manifest entries: - **VSIXSDK011**: Project templates defined but no `` in manifest - **VSIXSDK012**: Item templates defined but no `` in manifest -## Target Subfolders - -To organize templates into subfolders within the VSIX: - -```xml - - - - - - - -``` - ## Complete Example ### Project File @@ -149,7 +125,9 @@ To organize templates into subfolders within the VSIX: 1.0.0 - + + + ` entries for your templates: + ```xml @@ -206,7 +186,6 @@ To organize templates into subfolders within the VSIX: | Code | Description | |------|-------------| -| VSIXSDK010 | `VsixTemplateZip` item missing `TemplateType` metadata | | VSIXSDK011 | Project templates defined but no `` in manifest | | VSIXSDK012 | Item templates defined but no `` in manifest | | VSIXSDK013 | `VsixTemplateReference` item missing `TemplateType` metadata | @@ -217,7 +196,7 @@ To organize templates into subfolders within the VSIX: ### Templates not appearing in Visual Studio 1. Ensure your manifest has the appropriate `` entries -2. Check that the template zip files are included in the VSIX (open the .vsix as a zip) +2. Check that the template folders are included in the VSIX (open the .vsix as a zip) 3. Verify the `.vstemplate` file has correct `` or `` 4. Reset the Visual Studio template cache: delete `%LocalAppData%\Microsoft\VisualStudio\\ComponentModelCache` @@ -225,6 +204,9 @@ To organize templates into subfolders within the VSIX: Ensure the template folder exists and contains a `.vstemplate` file. For `VsixTemplateReference`, verify the `TemplatePath` is correct relative to the referenced project. -### Templates in wrong location in VSIX +### Cross-project templates not working -Check the `TargetSubPath` metadata if you're using custom paths. By default, templates are placed directly in `ProjectTemplates/` or `ItemTemplates/`. +1. Verify the referenced project path is correct +2. Check that `TemplateType` is set to `Project` or `Item` +3. Ensure `TemplatePath` points to a folder containing a `.vstemplate` file +4. The template folder will be copied to your local `ProjectTemplates/` or `ItemTemplates/` folder during build diff --git a/src/CodingWithCalvin.VsixSdk/Sdk/Sdk.Vsix.Templates.props b/src/CodingWithCalvin.VsixSdk/Sdk/Sdk.Vsix.Templates.props index eaff8a6..7f672e6 100644 --- a/src/CodingWithCalvin.VsixSdk/Sdk/Sdk.Vsix.Templates.props +++ b/src/CodingWithCalvin.VsixSdk/Sdk/Sdk.Vsix.Templates.props @@ -2,11 +2,16 @@ @@ -28,23 +33,22 @@ - - - - - diff --git a/src/CodingWithCalvin.VsixSdk/Sdk/Sdk.Vsix.Templates.targets b/src/CodingWithCalvin.VsixSdk/Sdk/Sdk.Vsix.Templates.targets index 8c5080d..ef1515b 100644 --- a/src/CodingWithCalvin.VsixSdk/Sdk/Sdk.Vsix.Templates.targets +++ b/src/CodingWithCalvin.VsixSdk/Sdk/Sdk.Vsix.Templates.targets @@ -2,23 +2,21 @@ - - - <_VsixTemplateIntermediateOutputPath>$(IntermediateOutputPath)VsixTemplates\ - + Note: VSSDK handles template packaging when the manifest contains + entries. This file provides + discovery, cross-project template support, and validation. + --> - + <_DiscoveredProjectTemplateFiles Include="$(MSBuildProjectDirectory)\$(VsixProjectTemplatesFolder)\**\*.vstemplate" @@ -27,10 +25,9 @@ Condition="Exists('$(MSBuildProjectDirectory)\$(VsixItemTemplatesFolder)')" /> - + - <_TemplateFolderName>%(_DiscoveredProjectTemplateFiles.Filename) @@ -43,170 +40,80 @@ - - $(DefaultItemExcludes);$(VsixProjectTemplatesFolder)\** - $(DefaultItemExcludes);$(VsixItemTemplatesFolder)\** - - - - + - - - - <_ZipFileName>%(VsixProjectTemplate._TemplateFolderName).zip - <_ZipOutputPath>$(_VsixTemplateIntermediateOutputPath)ProjectTemplates\%(VsixProjectTemplate.TargetSubPath) - - - - - <_ZipFileName>%(VsixItemTemplate._TemplateFolderName).zip - <_ZipOutputPath>$(_VsixTemplateIntermediateOutputPath)ItemTemplates\%(VsixItemTemplate.TargetSubPath) - - - + <_ReferencedProjectDir>$([System.IO.Path]::GetDirectoryName('%(Identity)')) <_TemplateFolderName>$([System.IO.Path]::GetFileName('%(VsixTemplateReference.TemplatePath)')) - + <_FullTemplatePath>%(VsixTemplateReference._ReferencedProjectDir)\%(VsixTemplateReference.TemplatePath) - <_ZipFileName>%(VsixTemplateReference._TemplateFolderName).zip - <_ZipOutputPath Condition="'%(VsixTemplateReference.TemplateType)' == 'Project'">$(_VsixTemplateIntermediateOutputPath)ProjectTemplates\%(VsixTemplateReference.TargetSubPath) - <_ZipOutputPath Condition="'%(VsixTemplateReference.TemplateType)' == 'Item'">$(_VsixTemplateIntermediateOutputPath)ItemTemplates\%(VsixTemplateReference.TargetSubPath) + <_TargetFolder Condition="'%(VsixTemplateReference.TemplateType)' == 'Project'">$(MSBuildProjectDirectory)\$(VsixProjectTemplatesFolder)\%(VsixTemplateReference._TemplateFolderName) + <_TargetFolder Condition="'%(VsixTemplateReference.TemplateType)' == 'Item'">$(MSBuildProjectDirectory)\$(VsixItemTemplatesFolder)\%(VsixTemplateReference._TemplateFolderName) - - - - - - - - - - - - - - + DependsOnTargets="PrepareVsixTemplateReferences" + Condition="'@(VsixTemplateReference)' != ''"> - + + + <_TemplateFilesToCopy Include="%(VsixTemplateReference._FullTemplatePath)\**\*"> + <_DestinationFolder>%(VsixTemplateReference._TargetFolder) + <_SourceFolder>%(VsixTemplateReference._FullTemplatePath) + <_VsixSubPathBase Condition="'%(VsixTemplateReference.TemplateType)' == 'Project'">$(VsixProjectTemplatesFolder)\%(VsixTemplateReference._TemplateFolderName) + <_VsixSubPathBase Condition="'%(VsixTemplateReference.TemplateType)' == 'Item'">$(VsixItemTemplatesFolder)\%(VsixTemplateReference._TemplateFolderName) + + - + + + + + + true + %(_VsixSubPathBase)\%(RecursiveDir) + Never + + - - - - - - - ProjectTemplates\%(VsixProjectTemplate.TargetSubPath) - false - - - - - ItemTemplates\%(VsixItemTemplate.TargetSubPath) - false - - - - - ProjectTemplates\%(VsixTemplateZip.TargetSubPath) - false - - - - - ItemTemplates\%(VsixTemplateZip.TargetSubPath) - false - - - - - ProjectTemplates\%(VsixTemplateReference.TargetSubPath) - false - - - - - ItemTemplates\%(VsixTemplateReference.TargetSubPath) - false - - - - - - - - - - @@ -257,12 +164,4 @@ Condition="'$(_HasItemTemplates)' == 'true' and '@(_ManifestItemTemplates)' == ''" /> - - - - - diff --git a/tests/e2e/E2E.AllFeatures/E2E.AllFeatures.csproj b/tests/e2e/E2E.AllFeatures/E2E.AllFeatures.csproj index 9956861..f87baeb 100644 --- a/tests/e2e/E2E.AllFeatures/E2E.AllFeatures.csproj +++ b/tests/e2e/E2E.AllFeatures/E2E.AllFeatures.csproj @@ -11,18 +11,13 @@ 1.0.0 - $(DefaultItemExcludes);PreBuiltSource\**;ManualTemplates\** + $(DefaultItemExcludes);ManualTemplates\** - - - - - @@ -33,13 +28,4 @@ - - - - - - diff --git a/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/Class1.cs b/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/Class1.cs deleted file mode 100644 index 4fc708c..0000000 --- a/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/Class1.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace $safeprojectname$ -{ - public class Class1 { } -} diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/E2E.Templates.PreBuiltZip.csproj b/tests/e2e/E2E.Templates.PreBuiltZip/E2E.Templates.PreBuiltZip.csproj deleted file mode 100644 index a77135c..0000000 --- a/tests/e2e/E2E.Templates.PreBuiltZip/E2E.Templates.PreBuiltZip.csproj +++ /dev/null @@ -1,46 +0,0 @@ - - - - - 1.0.0 - - false - - $(DefaultItemExcludes);TemplateSource\** - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/E2ETemplatesPreBuiltZipPackage.cs b/tests/e2e/E2E.Templates.PreBuiltZip/E2ETemplatesPreBuiltZipPackage.cs deleted file mode 100644 index 2df0cb9..0000000 --- a/tests/e2e/E2E.Templates.PreBuiltZip/E2ETemplatesPreBuiltZipPackage.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using System.Threading; -using Microsoft.VisualStudio.Shell; -using Task = System.Threading.Tasks.Task; - -namespace E2E.Templates.PreBuiltZip -{ - [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)] - [Guid("00000000-0000-0000-0000-00000000000A")] - public sealed class E2ETemplatesPreBuiltZipPackage : AsyncPackage - { - protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress progress) - { - await base.InitializeAsync(cancellationToken, progress); - await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); - } - } -} diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ItemTemplate/PreBuiltItem.vstemplate b/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ItemTemplate/PreBuiltItem.vstemplate deleted file mode 100644 index 055f055..0000000 --- a/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ItemTemplate/PreBuiltItem.vstemplate +++ /dev/null @@ -1,13 +0,0 @@ - - - - Pre-Built Item - An item template from a pre-built zip - CSharp - 10 - PreBuiltItem.cs - - - Item.cs - - diff --git a/tests/e2e/E2E.Templates.Reference/E2E.Templates.Reference.csproj b/tests/e2e/E2E.Templates.Reference/E2E.Templates.Reference.csproj new file mode 100644 index 0000000..c5fe1b2 --- /dev/null +++ b/tests/e2e/E2E.Templates.Reference/E2E.Templates.Reference.csproj @@ -0,0 +1,32 @@ + + + + + 1.0.0 + + $(DefaultItemExcludes);SharedTemplates\** + + + + + + + + + + + + + diff --git a/tests/e2e/E2E.Templates.Reference/E2ETemplatesReferencePackage.cs b/tests/e2e/E2E.Templates.Reference/E2ETemplatesReferencePackage.cs new file mode 100644 index 0000000..fcc6111 --- /dev/null +++ b/tests/e2e/E2E.Templates.Reference/E2ETemplatesReferencePackage.cs @@ -0,0 +1,11 @@ +using Microsoft.VisualStudio.Shell; +using System.Runtime.InteropServices; + +namespace E2E.Templates.Reference +{ + [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)] + [Guid("00000000-0000-0000-0000-000000000020")] + public sealed class E2ETemplatesReferencePackage : AsyncPackage + { + } +} diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ItemTemplate/Item.cs b/tests/e2e/E2E.Templates.Reference/SharedTemplates/ItemTemplate/Item.cs similarity index 60% rename from tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ItemTemplate/Item.cs rename to tests/e2e/E2E.Templates.Reference/SharedTemplates/ItemTemplate/Item.cs index 3889610..2adf76c 100644 --- a/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ItemTemplate/Item.cs +++ b/tests/e2e/E2E.Templates.Reference/SharedTemplates/ItemTemplate/Item.cs @@ -2,6 +2,5 @@ namespace $rootnamespace$ { public class $safeitemname$ { - // Created from pre-built item template } } diff --git a/tests/e2e/E2E.Templates.Reference/SharedTemplates/ItemTemplate/RefItem.vstemplate b/tests/e2e/E2E.Templates.Reference/SharedTemplates/ItemTemplate/RefItem.vstemplate new file mode 100644 index 0000000..63ddd28 --- /dev/null +++ b/tests/e2e/E2E.Templates.Reference/SharedTemplates/ItemTemplate/RefItem.vstemplate @@ -0,0 +1,12 @@ + + + + Referenced Item Template + An item template from a referenced project + CSharp + RefItem + + + Item.cs + + diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/Class1.cs b/tests/e2e/E2E.Templates.Reference/SharedTemplates/ProjectTemplate/Class1.cs similarity index 100% rename from tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/Class1.cs rename to tests/e2e/E2E.Templates.Reference/SharedTemplates/ProjectTemplate/Class1.cs diff --git a/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/Project.csproj b/tests/e2e/E2E.Templates.Reference/SharedTemplates/ProjectTemplate/Project.csproj similarity index 70% rename from tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/Project.csproj rename to tests/e2e/E2E.Templates.Reference/SharedTemplates/ProjectTemplate/Project.csproj index ec2cce1..d54876d 100644 --- a/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/Project.csproj +++ b/tests/e2e/E2E.Templates.Reference/SharedTemplates/ProjectTemplate/Project.csproj @@ -1,5 +1,6 @@ net8.0 + $safeprojectname$ diff --git a/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/PreBuiltProject.vstemplate b/tests/e2e/E2E.Templates.Reference/SharedTemplates/ProjectTemplate/RefProject.vstemplate similarity index 74% rename from tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/PreBuiltProject.vstemplate rename to tests/e2e/E2E.Templates.Reference/SharedTemplates/ProjectTemplate/RefProject.vstemplate index 8b424ad..5d2fb04 100644 --- a/tests/e2e/E2E.AllFeatures/PreBuiltSource/PreBuiltProject/PreBuiltProject.vstemplate +++ b/tests/e2e/E2E.Templates.Reference/SharedTemplates/ProjectTemplate/RefProject.vstemplate @@ -1,10 +1,10 @@ - Pre-Built Project - Pre-built zip template in AllFeatures + Referenced Project Template + A project template from a referenced project CSharp - PreBuiltProject + RefProject true diff --git a/tests/e2e/E2E.Templates.Reference/SharedTemplates/SharedTemplates.csproj b/tests/e2e/E2E.Templates.Reference/SharedTemplates/SharedTemplates.csproj new file mode 100644 index 0000000..23d6163 --- /dev/null +++ b/tests/e2e/E2E.Templates.Reference/SharedTemplates/SharedTemplates.csproj @@ -0,0 +1,18 @@ + + + + + netstandard2.0 + + false + + + + + $(DefaultItemExcludes);ProjectTemplate\**;ItemTemplate\** + + + diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/source.extension.vsixmanifest b/tests/e2e/E2E.Templates.Reference/source.extension.vsixmanifest similarity index 73% rename from tests/e2e/E2E.Templates.PreBuiltZip/source.extension.vsixmanifest rename to tests/e2e/E2E.Templates.Reference/source.extension.vsixmanifest index 302eb62..ab6f4d1 100644 --- a/tests/e2e/E2E.Templates.PreBuiltZip/source.extension.vsixmanifest +++ b/tests/e2e/E2E.Templates.Reference/source.extension.vsixmanifest @@ -1,9 +1,9 @@ - - E2E Templates PreBuiltZip Test - E2E test for VsixTemplateZip with pre-built zip files + + E2E Templates Reference Test + E2E test for VsixTemplateReference - cross-project template references diff --git a/tests/e2e/E2E.Templates.ReferenceManual/E2E.Templates.ReferenceManual.csproj b/tests/e2e/E2E.Templates.ReferenceManual/E2E.Templates.ReferenceManual.csproj new file mode 100644 index 0000000..e4fcbdb --- /dev/null +++ b/tests/e2e/E2E.Templates.ReferenceManual/E2E.Templates.ReferenceManual.csproj @@ -0,0 +1,31 @@ + + + + + 1.0.0 + + $(DefaultItemExcludes);SharedTemplates\** + + + + + + + + + + + + + diff --git a/tests/e2e/E2E.Templates.ReferenceManual/E2ETemplatesReferenceManualPackage.cs b/tests/e2e/E2E.Templates.ReferenceManual/E2ETemplatesReferenceManualPackage.cs new file mode 100644 index 0000000..3d96142 --- /dev/null +++ b/tests/e2e/E2E.Templates.ReferenceManual/E2ETemplatesReferenceManualPackage.cs @@ -0,0 +1,11 @@ +using Microsoft.VisualStudio.Shell; +using System.Runtime.InteropServices; + +namespace E2E.Templates.ReferenceManual +{ + [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)] + [Guid("00000000-0000-0000-0000-000000000021")] + public sealed class E2ETemplatesReferenceManualPackage : AsyncPackage + { + } +} diff --git a/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ItemTemplate/Item.cs b/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ItemTemplate/Item.cs new file mode 100644 index 0000000..2adf76c --- /dev/null +++ b/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ItemTemplate/Item.cs @@ -0,0 +1,6 @@ +namespace $rootnamespace$ +{ + public class $safeitemname$ + { + } +} diff --git a/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ItemTemplate/RefItem.vstemplate b/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ItemTemplate/RefItem.vstemplate new file mode 100644 index 0000000..2e14a7c --- /dev/null +++ b/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ItemTemplate/RefItem.vstemplate @@ -0,0 +1,12 @@ + + + + Referenced Item Template (Manual) + An item template from a referenced project (manual manifest) + CSharp + RefItem + + + Item.cs + + diff --git a/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ProjectTemplate/Class1.cs b/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ProjectTemplate/Class1.cs new file mode 100644 index 0000000..468679e --- /dev/null +++ b/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ProjectTemplate/Class1.cs @@ -0,0 +1,6 @@ +namespace $safeprojectname$ +{ + public class Class1 + { + } +} diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/Project.csproj b/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ProjectTemplate/Project.csproj similarity index 62% rename from tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/Project.csproj rename to tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ProjectTemplate/Project.csproj index e8cd599..d54876d 100644 --- a/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/Project.csproj +++ b/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ProjectTemplate/Project.csproj @@ -1,7 +1,6 @@ net8.0 - enable - enable + $safeprojectname$ diff --git a/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/PreBuiltProject.vstemplate b/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ProjectTemplate/RefProject.vstemplate similarity index 54% rename from tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/PreBuiltProject.vstemplate rename to tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ProjectTemplate/RefProject.vstemplate index 6c17dd0..70b00c5 100644 --- a/tests/e2e/E2E.Templates.PreBuiltZip/TemplateSource/ProjectTemplate/PreBuiltProject.vstemplate +++ b/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/ProjectTemplate/RefProject.vstemplate @@ -1,17 +1,15 @@ - Pre-Built Project Template - A project template from a pre-built zip + Referenced Project Template (Manual) + A project template from a referenced project (manual manifest) CSharp - 1000 - PreBuiltProject + RefProject true - true - Class1.cs + Class1.cs diff --git a/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/SharedTemplates.csproj b/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/SharedTemplates.csproj new file mode 100644 index 0000000..23d6163 --- /dev/null +++ b/tests/e2e/E2E.Templates.ReferenceManual/SharedTemplates/SharedTemplates.csproj @@ -0,0 +1,18 @@ + + + + + netstandard2.0 + + false + + + + + $(DefaultItemExcludes);ProjectTemplate\**;ItemTemplate\** + + + diff --git a/tests/e2e/E2E.Templates.ReferenceManual/source.extension.vsixmanifest b/tests/e2e/E2E.Templates.ReferenceManual/source.extension.vsixmanifest new file mode 100644 index 0000000..3ca269e --- /dev/null +++ b/tests/e2e/E2E.Templates.ReferenceManual/source.extension.vsixmanifest @@ -0,0 +1,24 @@ + + + + + E2E Templates Reference Manual Test + E2E test for VsixTemplateReference with manual manifest Content entries + + + + amd64 + + + + + + + + + + + + + + From 6ac811e0448c4adc0f39c8a803b31b664142b0af Mon Sep 17 00:00:00 2001 From: "Calvin A. Allen" Date: Wed, 7 Jan 2026 17:14:23 -0500 Subject: [PATCH 2/3] fix(sdk): include auto-discovered templates in VSIX Add Content items for auto-discovered project and item templates so they are included in the VSIX package. The removal of template zipping also removed the mechanism that added templates to the VSIX, which broke auto-discovery scenarios. --- .../Sdk/Sdk.Vsix.Templates.targets | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/CodingWithCalvin.VsixSdk/Sdk/Sdk.Vsix.Templates.targets b/src/CodingWithCalvin.VsixSdk/Sdk/Sdk.Vsix.Templates.targets index ef1515b..d6fa714 100644 --- a/src/CodingWithCalvin.VsixSdk/Sdk/Sdk.Vsix.Templates.targets +++ b/src/CodingWithCalvin.VsixSdk/Sdk/Sdk.Vsix.Templates.targets @@ -37,6 +37,28 @@ <_TemplateFolderName>%(_DiscoveredItemTemplateFiles.Filename) + + + + <_ProjectTemplateFiles Include="$(MSBuildProjectDirectory)\$(VsixProjectTemplatesFolder)\**\*" /> + + true + $(VsixProjectTemplatesFolder)\%(RecursiveDir) + Never + + + + + <_ItemTemplateFiles Include="$(MSBuildProjectDirectory)\$(VsixItemTemplatesFolder)\**\*" /> + + true + $(VsixItemTemplatesFolder)\%(RecursiveDir) + Never + +