|
15 | 15 | </PropertyGroup> |
16 | 16 |
|
17 | 17 | <!-- |
18 | | - Auto-discover project templates in the ProjectTemplates folder. |
19 | | - Each subfolder containing a .vstemplate file becomes a VsixProjectTemplate item. |
| 18 | + Auto-discover project and item templates. |
| 19 | + Discovery must happen in a target because we need to compute additional metadata. |
20 | 20 | --> |
21 | | - <ItemGroup Condition="'$(EnableDefaultVsixTemplateItems)' == 'true' and '$(EnableDefaultItems)' != 'false'"> |
| 21 | + <Target Name="DiscoverVsixTemplates" BeforeTargets="PrepareVsixTemplates"> |
22 | 22 | <!-- Find all .vstemplate files in ProjectTemplates subfolders --> |
23 | | - <_DiscoveredProjectTemplateFiles Include="$(VsixProjectTemplatesFolder)\**\*.vstemplate" |
24 | | - Condition="Exists('$(MSBuildProjectDirectory)\$(VsixProjectTemplatesFolder)')" |
25 | | - Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" /> |
26 | | - |
27 | | - <!-- Convert to folder paths (parent of each .vstemplate) --> |
28 | | - <VsixProjectTemplate Include="@(_DiscoveredProjectTemplateFiles->'%(RootDir)%(Directory)'->TrimEnd('\')->Distinct())" |
29 | | - Condition="'@(_DiscoveredProjectTemplateFiles)' != ''" /> |
30 | | - </ItemGroup> |
| 23 | + <ItemGroup Condition="'$(EnableDefaultVsixTemplateItems)' == 'true' and '$(EnableDefaultItems)' != 'false'"> |
| 24 | + <_DiscoveredProjectTemplateFiles Include="$(MSBuildProjectDirectory)\$(VsixProjectTemplatesFolder)\**\*.vstemplate" |
| 25 | + Condition="Exists('$(MSBuildProjectDirectory)\$(VsixProjectTemplatesFolder)')" /> |
| 26 | + <_DiscoveredItemTemplateFiles Include="$(MSBuildProjectDirectory)\$(VsixItemTemplatesFolder)\**\*.vstemplate" |
| 27 | + Condition="Exists('$(MSBuildProjectDirectory)\$(VsixItemTemplatesFolder)')" /> |
| 28 | + </ItemGroup> |
31 | 29 |
|
32 | | - <!-- |
33 | | - Auto-discover item templates in the ItemTemplates folder. |
34 | | - Each subfolder containing a .vstemplate file becomes a VsixItemTemplate item. |
35 | | - --> |
36 | | - <ItemGroup Condition="'$(EnableDefaultVsixTemplateItems)' == 'true' and '$(EnableDefaultItems)' != 'false'"> |
37 | | - <!-- Find all .vstemplate files in ItemTemplates subfolders --> |
38 | | - <_DiscoveredItemTemplateFiles Include="$(VsixItemTemplatesFolder)\**\*.vstemplate" |
39 | | - Condition="Exists('$(MSBuildProjectDirectory)\$(VsixItemTemplatesFolder)')" |
40 | | - Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder)" /> |
| 30 | + <!-- Create VsixProjectTemplate items - use the parent directory of the .vstemplate file --> |
| 31 | + <ItemGroup Condition="'@(_DiscoveredProjectTemplateFiles)' != ''"> |
| 32 | + <VsixProjectTemplate Include="@(_DiscoveredProjectTemplateFiles->'%(RootDir)%(Directory)')"> |
| 33 | + <!-- Compute folder name from .vstemplate filename by getting its parent folder --> |
| 34 | + <_TemplateFolderName>%(_DiscoveredProjectTemplateFiles.Filename)</_TemplateFolderName> |
| 35 | + </VsixProjectTemplate> |
| 36 | + </ItemGroup> |
41 | 37 |
|
42 | | - <!-- Convert to folder paths (parent of each .vstemplate) --> |
43 | | - <VsixItemTemplate Include="@(_DiscoveredItemTemplateFiles->'%(RootDir)%(Directory)'->TrimEnd('\')->Distinct())" |
44 | | - Condition="'@(_DiscoveredItemTemplateFiles)' != ''" /> |
45 | | - </ItemGroup> |
| 38 | + <ItemGroup Condition="'@(_DiscoveredItemTemplateFiles)' != ''"> |
| 39 | + <VsixItemTemplate Include="@(_DiscoveredItemTemplateFiles->'%(RootDir)%(Directory)')"> |
| 40 | + <_TemplateFolderName>%(_DiscoveredItemTemplateFiles.Filename)</_TemplateFolderName> |
| 41 | + </VsixItemTemplate> |
| 42 | + </ItemGroup> |
| 43 | + </Target> |
46 | 44 |
|
47 | 45 | <!-- |
48 | 46 | Exclude template source files from being included as Content in the VSIX. |
|
57 | 55 | Target: PrepareVsixTemplates |
58 | 56 | Prepares template items for zipping by computing output paths. |
59 | 57 | --> |
60 | | - <Target Name="PrepareVsixTemplates" BeforeTargets="ZipVsixTemplates"> |
| 58 | + <Target Name="PrepareVsixTemplates" BeforeTargets="ZipVsixTemplates" DependsOnTargets="DiscoverVsixTemplates"> |
61 | 59 | <ItemGroup> |
62 | | - <!-- Compute zip file name from folder name for project templates --> |
| 60 | + <!-- Compute zip file name and output path for project templates --> |
| 61 | + <!-- _TemplateFolderName was set during discovery from the .vstemplate filename --> |
63 | 62 | <VsixProjectTemplate> |
64 | | - <_TemplateFolderName>$([System.IO.Path]::GetFileName('%(Identity)'))</_TemplateFolderName> |
65 | 63 | <_ZipFileName>%(VsixProjectTemplate._TemplateFolderName).zip</_ZipFileName> |
66 | 64 | <_ZipOutputPath>$(_VsixTemplateIntermediateOutputPath)ProjectTemplates\%(VsixProjectTemplate.TargetSubPath)</_ZipOutputPath> |
67 | 65 | </VsixProjectTemplate> |
68 | 66 |
|
69 | | - <!-- Compute zip file name from folder name for item templates --> |
| 67 | + <!-- Compute zip file name and output path for item templates --> |
70 | 68 | <VsixItemTemplate> |
71 | | - <_TemplateFolderName>$([System.IO.Path]::GetFileName('%(Identity)'))</_TemplateFolderName> |
72 | 69 | <_ZipFileName>%(VsixItemTemplate._TemplateFolderName).zip</_ZipFileName> |
73 | 70 | <_ZipOutputPath>$(_VsixTemplateIntermediateOutputPath)ItemTemplates\%(VsixItemTemplate.TargetSubPath)</_ZipOutputPath> |
74 | 71 | </VsixItemTemplate> |
|
146 | 143 | Condition="'@(VsixProjectTemplate)' != ''"> |
147 | 144 | <VSIXSubPath>ProjectTemplates\%(VsixProjectTemplate.TargetSubPath)</VSIXSubPath> |
148 | 145 | <Ngen>false</Ngen> |
149 | | - <InstallRoot>ProjectTemplates</InstallRoot> |
150 | 146 | </VSIXSourceItem> |
151 | 147 |
|
152 | 148 | <!-- Add zipped item templates --> |
153 | 149 | <VSIXSourceItem Include="%(VsixItemTemplate._ZipOutputPath)%(VsixItemTemplate._ZipFileName)" |
154 | 150 | Condition="'@(VsixItemTemplate)' != ''"> |
155 | 151 | <VSIXSubPath>ItemTemplates\%(VsixItemTemplate.TargetSubPath)</VSIXSubPath> |
156 | 152 | <Ngen>false</Ngen> |
157 | | - <InstallRoot>ItemTemplates</InstallRoot> |
158 | 153 | </VSIXSourceItem> |
159 | 154 |
|
160 | 155 | <!-- Add pre-built template zips (project templates) --> |
161 | 156 | <VSIXSourceItem Include="%(VsixTemplateZip.Identity)" |
162 | 157 | Condition="'@(VsixTemplateZip)' != '' and '%(VsixTemplateZip.TemplateType)' == 'Project'"> |
163 | 158 | <VSIXSubPath>ProjectTemplates\%(VsixTemplateZip.TargetSubPath)</VSIXSubPath> |
164 | 159 | <Ngen>false</Ngen> |
165 | | - <InstallRoot>ProjectTemplates</InstallRoot> |
166 | 160 | </VSIXSourceItem> |
167 | 161 |
|
168 | 162 | <!-- Add pre-built template zips (item templates) --> |
169 | 163 | <VSIXSourceItem Include="%(VsixTemplateZip.Identity)" |
170 | 164 | Condition="'@(VsixTemplateZip)' != '' and '%(VsixTemplateZip.TemplateType)' == 'Item'"> |
171 | 165 | <VSIXSubPath>ItemTemplates\%(VsixTemplateZip.TargetSubPath)</VSIXSubPath> |
172 | 166 | <Ngen>false</Ngen> |
173 | | - <InstallRoot>ItemTemplates</InstallRoot> |
174 | 167 | </VSIXSourceItem> |
175 | 168 |
|
176 | 169 | <!-- Add template references (project templates) --> |
177 | 170 | <VSIXSourceItem Include="%(VsixTemplateReference._ZipOutputPath)%(VsixTemplateReference._ZipFileName)" |
178 | 171 | Condition="'@(VsixTemplateReference)' != '' and '%(VsixTemplateReference.TemplateType)' == 'Project'"> |
179 | 172 | <VSIXSubPath>ProjectTemplates\%(VsixTemplateReference.TargetSubPath)</VSIXSubPath> |
180 | 173 | <Ngen>false</Ngen> |
181 | | - <InstallRoot>ProjectTemplates</InstallRoot> |
182 | 174 | </VSIXSourceItem> |
183 | 175 |
|
184 | 176 | <!-- Add template references (item templates) --> |
185 | 177 | <VSIXSourceItem Include="%(VsixTemplateReference._ZipOutputPath)%(VsixTemplateReference._ZipFileName)" |
186 | 178 | Condition="'@(VsixTemplateReference)' != '' and '%(VsixTemplateReference.TemplateType)' == 'Item'"> |
187 | 179 | <VSIXSubPath>ItemTemplates\%(VsixTemplateReference.TargetSubPath)</VSIXSubPath> |
188 | 180 | <Ngen>false</Ngen> |
189 | | - <InstallRoot>ItemTemplates</InstallRoot> |
190 | 181 | </VSIXSourceItem> |
191 | 182 | </ItemGroup> |
192 | 183 | </Target> |
|
0 commit comments