Как иметь статические папки в Visual Studio ProjectGroup .vstemplate? - PullRequest
0 голосов
/ 05 сентября 2018

Мой шаблон 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

Я пытался использовать элементы Folder в ProjectGroup. Это не работает (но также не вызывает ошибок).

Можно ли это сделать с помощью .vstemplate? Или мне нужно использовать WizardExtension (и код C #)?

1 Ответ

0 голосов
/ 06 сентября 2018

Я использовал WizardExtension

Итак, в итоге

  1. Добавьте необходимые файлы как часть одного из шаблонов проекта (внесите изменения в оба файла .vstemplate И .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
        {
           ...
        }
    }

Я получаю _destinationDirectory и _solutionDirectory во время RunStarted метода.

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

3

Наконец, приведите в порядок проект (файл .csproj или .cxproj) программным способом, используя объект EnvDTE Project . Необходимо удалить только файлы.

 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
        {
           ....
        }
    }
...