如何在Visual Studio ProjectGroup .vstemplate中拥有静态文件夹?

问题描述 投票:1回答:1

我的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#代码)?

visual-studio templates visual-studio-2015
1个回答
0
投票

我最终使用了WizardExtension

所以总结一下

  1. 将所需文件添加为项目模板之一(对.vstemplate和.csproj / .vcxproj文件进行更改)。
  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
        {
           ....
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.