如何在多项目解决方案模板中包含“解决方案项”文件

Arn*_*VdP 6 multi-project project-template visual-studio

我正在尝试为 Visual Studio 2019 创建多项目解决方案模板。我可以在多个文件夹中成功添加多个项目。

作为下一步,我想将本地文件添加到解决方案的根目录中,甚至添加到诸如.gitignore, nuget.config,... 文件的文件夹中,但到目前为止还没有运气。

下面是我的.vstemplate文件,注释行是我要添加的文件。我已经尝试过这种方式,将线条放在一个<SolutionFolder>块中,将它们放在ProjectCollection块外,......

<VSTemplate Version="3.0.0" Type="ProjectGroup" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
  <TemplateData>
    <Name>Test Application</Name>
    <Description>A project template for creating a basic Test Application</Description>
    <ProjectType>CSharp</ProjectType>
    <ProjectSubType>
    </ProjectSubType>
    <SortOrder>1000</SortOrder>
    <CreateNewFolder>false</CreateNewFolder>
    <DefaultName>MaestroApp</DefaultName>
    <ProvideDefaultName>true</ProvideDefaultName>
    <LocationField>Enabled</LocationField>
    <EnableLocationBrowseButton>true</EnableLocationBrowseButton>
    <BuildOnLoad>true</BuildOnLoad>
    <Icon>M.png</Icon>
  </TemplateData>
  <TemplateContent>
    <ProjectCollection>
<!--
        <ProjectItem ReplaceParameters="false" TargetFileName=".gitattributes">.gitattributes</ProjectItem>
        <ProjectItem ReplaceParameters="false" TargetFileName=".gitignore">.gitignore</ProjectItem>
        <ProjectItem ReplaceParameters="false" TargetFileName="directory.build.props">directory.build.props</ProjectItem>
        <ProjectItem ReplaceParameters="false" TargetFileName="nuget.config">nuget.config</ProjectItem>
        <ProjectItem ReplaceParameters="false" TargetFileName="README.MD">README.MD</ProjectItem>-->
      <SolutionFolder Name="Documents" CreateOnDisk="true"></SolutionFolder>
      <SolutionFolder Name="src" CreateOnDisk="true">
        <ProjectTemplateLink ProjectName="$projectname$" CopyParameters="true">
          MaestroApplicationTemplate\MyTemplate.vstemplate
        </ProjectTemplateLink>
        <ProjectTemplateLink ProjectName="$projectname$.Data" CopyParameters="true">
          MaestroApplicationTemplate.Data\MyTemplate.vstemplate
        </ProjectTemplateLink>
        <ProjectTemplateLink ProjectName="$projectname$.ProcessEngine" CopyParameters="true">
          MaestroApplicationTemplate.ProcessEngine\MyTemplate.vstemplate
        </ProjectTemplateLink>
      </SolutionFolder>
      <SolutionFolder Name="Test" CreateOnDisk="true">
      </SolutionFolder>
    </ProjectCollection>
  </TemplateContent>
</VSTemplate>
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激!

Raz*_*iel 0

我知道您问的是 a .vstemplate,但我认为由于dotnet new现在模板更合适,让我回答如何在那里做(因为它也需要一些修补):

我假设您已经根据需要构建了解决方案,添加了所有解决方案文件等。然后您添加了 template.json,如文档中所述。

下一步是确保模板 JSON 具有solution类型,而不是通常的“项目”:

"tags": {
  "language": "C#",
  "type": "solution"
},
Run Code Online (Sandbox Code Playgroud)

此外,您还需要确保解决方案文件的名称与您在模板中设置的标识不同。Visual Studio 不喜欢这样,并且会用它自己的解决方案覆盖您提供的解决方案,从而以某种方式丢失所有解决方案文件。我真的不知道为什么。

因此,如果您的身份设置BlazorServerApp如下:

"identity": "BlazorServerApp",
Run Code Online (Sandbox Code Playgroud)

然后将解决方案命名为GeneratedSolution.sln. 然后添加一个修饰符,将该解决方案重命名为正确的名称:

"sources": [
{
  "modifiers": [
  {
     "condition": "(HostIdentifier == \"dotnetcli\" ||  HostIdentifier == \"dotnetcli-preview\")",
       "rename": {
         "GeneratedSolution.sln": "BlazorServerApp.sln"
       }
     }
   ]
  }
],
Run Code Online (Sandbox Code Playgroud)

完成后,模板应该在 Visual Studio 和dotnet new.

您可能还会遇到隐藏文件未包含在模板中的问题,例如在尝试包含.editorconfig. 另一个SO问题中有一个解决方案。

这是一个完整的例子template.json

{
  "$schema": "http://json.schemastore.org/template",
  "author": "Your Name",
  "name": "Blazor Server Application",
  "description": "A blazor server solution template",
  "identity": "BlazorServerApp",
  "shortName": "my-blazor-server",
  "classifications": [ "Web", "Blazor" ],
  "icon": "icon.png",
  
  "sourceName": "BlazorServerApp",
  "preferNameDirectory": true,

  "guids": [
    "53C5DAEE-6473-4825-87C2-46EBC88EBBD3",
    "E5E29BA4-B30E-46DD-A9F2-8378E685C5F8"
  ],
  
  "tags": {
    "language": "C#",
    "type": "solution"
  },
  
  "sources": [
    {
      "exclude": [
        ".idea/**",
        ".template.config/**",
        "**/node_modules/**/*"
      ],
      "modifiers": [
        {
          "condition": "(HostIdentifier == \"dotnetcli\" ||  HostIdentifier == \"dotnetcli-preview\")",
          "rename": {
            "GeneratedSolution.sln": "BlazorServerApp.sln"
          }
        },
        {
          "rename": {
            "editorconfig": ".editorconfig",
            "gitignore": ".gitignore"
          }
        }
      ]
    }
  ],
  
  "symbols": {
    "HostIdentifier": {
      "type": "bind",
      "binding": "HostIdentifier"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是在 Visual Studio 中生成的解决方案的屏幕截图,其中包含所有解决方案文件:

生成的解决方案