首页 > 解决方案 > 让变量在 Visual Studio 模板中工作

问题描述

我正在尝试制作一个简单的概念证明类型的 Visual Studio 模板,但我似乎无法让内置变量像应有的那样工作。我正在尝试遵循此处的文档https://docs.microsoft.com/en-us/visualstudio/ide/template-parameters?view=vs-2019但它不起作用。

<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
  <TemplateData>
    <Name>Readers</Name>
    <Description>&lt;No description available&gt;</Description>
    <ProjectType>CSharp</ProjectType>
    <ProjectSubType>
    </ProjectSubType>
    <SortOrder>1000</SortOrder>
    <CreateNewFolder>true</CreateNewFolder>
    <DefaultName>Readers</DefaultName>
    <ProvideDefaultName>true</ProvideDefaultName>
    <LocationField>Enabled</LocationField>
    <EnableLocationBrowseButton>true</EnableLocationBrowseButton>
    <Icon>__TemplateIcon.ico</Icon>
  </TemplateData>
  <TemplateContent>
    <Project TargetFileName="Readers.csproj" File="Readers.csproj" ReplaceParameters="true">
      <ProjectItem ReplaceParameters="true" TargetFileName="App.config">App.config</ProjectItem>
      <ProjectItem ReplaceParameters="true" TargetFileName="DBAccess.cs">DBAccess.cs</ProjectItem>
      <ProjectItem ReplaceParameters="true" TargetFileName="$safeprojectname$.cs">MainReader.cs</ProjectItem>
      <ProjectItem ReplaceParameters="true" TargetFileName="packages.config">packages.config</ProjectItem>
      <Folder Name="Properties" TargetFolderName="Properties">
        <ProjectItem ReplaceParameters="true" TargetFileName="AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>
        <ProjectItem ReplaceParameters="true" TargetFileName="Resources.resx">Resources.resx</ProjectItem>
        <ProjectItem ReplaceParameters="true" TargetFileName="Resources.Designer.cs">Resources.Designer.cs</ProjectItem>
        <ProjectItem ReplaceParameters="true" TargetFileName="Settings.settings">Settings.settings</ProjectItem>
        <ProjectItem ReplaceParameters="true" TargetFileName="Settings.Designer.cs">Settings.Designer.cs</ProjectItem>
      </Folder>
      <ProjectItem ReplaceParameters="true" TargetFileName="ReaderBase.cs">ReaderBase.cs</ProjectItem>
    </Project>
  </TemplateContent>
</VSTemplate>

这就是我按照那个例子想出的。这基本上与我在 Visual Studio 中执行 Project -> Export Template 时生成的模板文件相同,但该行除外。

      <ProjectItem ReplaceParameters="true" TargetFileName="$safeprojectname$.cs">MainReader.cs</ProjectItem>

当我使用这个模板创建一个新文件时,它应该将 MainReader.cs 文件重命名为项目的名称。它不会,每当我使用此模板创建一个新项目时,该文件都会保留名称 MainReader.cs。我尝试将 ext_ 扩展名添加到名称中,我尝试使用括号内的变量而不是外部和两者。必须有其他东西我错过了,或者这可能不再是一个东西了。我用来获取模板的过程是使用导出模板向导,提取该 zip 文件,更改 .vstemplate 文件,将整个内容放回 zip 文件中,然后最后替换导出模板中的 zip 文件视觉工作室的文件夹。我可能需要在另一个地方放置修改后的 zip 文件,但我不确定。

标签: visual-studiovisual-studio-templates

解决方案


所以我终于设法让这个工作,它最终成为多个问题。

首先,我实际上将我的新模板保存到了错误的位置。导出的模板文件夹不是 Visual Studio 查找用户创建的模板的地方,这很令人困惑,因为它会自动将您导出的任何模板添加到它的列表中,因此您可能会看到这个文件夹充满了在您制作新项目时出现的模板并认为这就是它从中提取模板列表的地方。此处记录了用户创建的模板的实际位置。https://docs.microsoft.com/en-us/visualstudio/ide/how-to-locate-and-organize-project-and-item-templates?view=vs-2019在用户模板部分。您还可以在工具 -> 选项 -> 项目和解决方案 -> 位置下更改此位置。正确的过程是导出模板,将 zip 文件解压缩到可以处理的地方,对 vstemplate 文件和 proj 文件进行更改(稍后我会讲到),将所有这些压缩成一个 zip文件,然后将该文件放在用户模板目录中。

我注意到的另一件事,特别是在将文件名设置为变量时,您还必须编辑 .csproj 文件(或我假设的任何其他项目文件)并更改其中的文件名以匹配在 .vstemplate 文件上。就我而言,为了使它起作用

      <ProjectItem ReplaceParameters="true" TargetFileName="$safeprojectname$.cs">MainReader.cs</ProjectItem>

我的 csproj 文件必须包含这个

    <Compile Include="$safeprojectname$.cs" />

替换列出 MainReader.cs 的旧行。处理好这两个问题后,我可以看到文件名发生了变化,就像我预期的那样。


推荐阅读