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

时间:2018-09-05 08:32:07

标签: visual-studio templates visual-studio-2015

我的ProjectGroup模板包含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>

这是一张图片

enter image description here

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

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

1 个答案:

答案 0 :(得分:0)

我最终使用了WizardExtension

总而言之

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

在一些代码下面,使其更加具体。

1

将文件夹+文件添加到项目模板.vstemplate(而不是问题中显示的项目组模板)和.csproj / cxproj文件中。这是一种临时措施,因此,当用户在Visual Studio中执行项目模板(通过按File-> New Project)时,将首先安装/创建文件。

下面是.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
        {
           ...
        }
    }

_destinationDirectory方法中,我得到了_solutionDirectoryRunStarted

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
        {
           ....
        }
    }
相关问题