如何在 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
综上所述
- 将所需文件添加为项目模板之一(对 .vstemplate AND .csproj / .cxproj 文件进行更改)。
- 安装项目后,在向导扩展的
RunFinished
方法中将文件移动到所需位置。
- 在向导扩展的
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
{
....
}
}
我的项目组模板包含 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
综上所述
- 将所需文件添加为项目模板之一(对 .vstemplate AND .csproj / .cxproj 文件进行更改)。
- 安装项目后,在向导扩展的
RunFinished
方法中将文件移动到所需位置。 - 在向导扩展的
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
{
....
}
}