我的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>
这是一张照片
我尝试在ProjectGroup中使用Folder元素。这不起作用(但也不会导致错误)。
这可以用.vstemplate完成吗?或者我需要使用WizardExtension(和C#代码)?
我最终使用了WizardExtension
所以总结一下
RunFinished
方法内部将文件移动到所需位置。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
方法中得到了_solutionDirectory
和RunStarted
。
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
{
....
}
}