如何在 Visual Studio ProjectGroup .vstemplate 中包含静态文件夹?

How to have static folders within a Visual Studio ProjectGroup .vstemplate?

我的项目组模板包含 2 个项目。在与项目相同的级别,我需要创建一个文件夹(包含子文件夹和文件)。文件夹名称和内容是静态的。

我的模板是这样的

<VSTemplate Version="2.0.0" Type="ProjectGroup"  xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">

  <TemplateData>
   <Name>My Solution</Name>
   ...
  </TemplateData>

  <TemplateContent>

    <ProjectCollection>
      <ProjectTemplateLink ProjectName="MyCPPProject">
        Folder1\MyCPP.vstemplate
      </ProjectTemplateLink>
      <ProjectTemplateLink ProjectName="MyCSharpProject">
        Folder1\MyCSharp.vstemplate
      </ProjectTemplateLink>
    </ProjectCollection>

    <!-- * * * *  Below is my attempt to create the folders  * * * * -->

    <Folder Name="packages" TargetFolderName="packages">
      <Folder Name="debug" TargetFolderName="debug">
        <Folder Name="bin" TargetFolderName="bin">
        </Folder>
        <Folder Name="doc" TargetFolderName="doc">
          <Folder Name="text" TargetFolderName="text">
            <Folder Name="abc" TargetFolderName="abc">
              <ProjectItem ReplaceParameters="false"     TargetFileName="file1.xml">file1.xml</ProjectItem>
              <ProjectItem ReplaceParameters="false" TargetFileName="file2.xml">file2.xml</ProjectItem>
            </Folder>
            <Folder Name="def" TargetFolderName="def">
              <ProjectItem ReplaceParameters="false" TargetFileName="image.png">image.png</ProjectItem>
            </Folder>
          </Folder>
        </Folder>
      </Folder>
    </Folder>
  </TemplateContent>

  <WizardExtension>
   ...
  </WizardExtension>

</VSTemplate>

这是一张照片

我尝试在 ProjectGroup 中使用 Folder 元素。这不起作用(但也不会导致错误)。

这可以用 .vstemplate 完成吗?还是我需要使用 WizardExtension(和 C# 代码)?

我最终使用了 WizardExtension

综上所述

  1. 将所需文件添加为项目模板之一(对 .vstemplate AND .csproj / .cxproj 文件进行更改)。
  2. 安装项目后,在向导扩展的 RunFinished 方法中将文件移动到所需位置。
  3. 在向导扩展的 ProjectFinishedGenerating 方法中使用 EnvDTE Project 对象从项目中删除文件。

下面是一些代码,使它更具体。

1

将文件夹 + 文件添加到项目模板 .vstemplate(不是问题中显示的项目组模板)和 .csproj / cxproj 文件。这是一项临时措施,以便当用户在 Visual Studio 中执行项目模板时(通过按文件 -> 新建项目),最初安装/创建文件。

下面是 .vstemplate 文件

...
<Folder Name="packages" TargetFolderName="packages">
      <Folder Name="debug" TargetFolderName="debug">
        <Folder Name="doc" TargetFolderName="doc">
          <Folder Name="text" TargetFolderName="text">
            <Folder Name="abc" TargetFolderName="abc">
              <ProjectItem ReplaceParameters="false"     TargetFileName="file1.xml">file1.xml</ProjectItem>
              <ProjectItem ReplaceParameters="false" TargetFileName="file2.xml">file2.xml</ProjectItem>
            </Folder>
            <Folder Name="def" TargetFolderName="def">
              <ProjectItem ReplaceParameters="false" TargetFileName="image.png">image.png</ProjectItem>
            </Folder>
          </Folder>
        </Folder>
      </Folder>
    </Folder>
...

这里是 .cxproj 文件的摘录

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
 <ItemGroup Label="RTMaps Documentation">
    <None Include ="packages\debug\doc\text\abc\file1.xml" />
    <None Include ="packages\debug\doc\text\abc\file2.xml" />
    <None Include ="packages\debug\doc\text\def\image.png" />
 </ItemGroup>
...
</Project>

2

在 WizardExtension 中使用 System.IO 移动文件夹(及其内容),例如

public void RunFinished()
    { 
        try
        {
            var src = Path.Combine(_destinationDirectory, "packages");
            var dest = Path.Combine(_solutionDirectory, "admin");
            System.IO.Directory.CreateDirectory(dest);
            dest = Path.Combine(dest, "packages");
            Directory.Move(src, dest);
        }
        catch
        {
           ...
        }
    }

我在 RunStarted 方法中得到 _destinationDirectory_solutionDirectory

public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
    {           
        _destinationDirectory = replacementsDictionary["$destinationdirectory$"];
        _solutionDirectory = replacementsDictionary["$solutiondirectory$"];
    }

3

最后使用 EnvDTE Project 对象以编程方式整理项目(.csproj 或 .cxproj 文件)。只有文件需要删除。

 public void ProjectFinishedGenerating(Project project)
    {        
        try
        {
            project.ProjectItems.Item("file1.xml").Remove();
            project.ProjectItems.Item("file2.xml").Remove();
            project.ProjectItems.Item("image.png").Remove();
        }
        catch
        {
           ....
        }
    }