作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为我公司的 MVC 4 应用程序创建自定义 VSTemplate,它使用的向导与创建新 MVC4 应用程序时出现的向导相当。我有两个模板之一,我想在开发人员创建此类新应用时应用,如下所示:
这两个条目都对应于我的 VSIX 项目中名为 ProjectTemplates 的文件夹下定义的模板:
我的问题是,如何在向导运行时应用正确的模板?我知道如何创建包含多个项目的 vstemplate(使用 vstemplate 中的 ProjectCollection 节点),但这并不是我真正想要做的,因为它们永远不会一起部署。我发现我可以将两个 vstemplates 作为 Assets 添加到我的 vsixmanifest 文件中,但我不确定如何有条件地只应用一个模板。
谢谢!
最佳答案
您需要将“可选”模板的文件包含在“根”模板文件夹的子目录中,但从 TemplateContent Element
中排除它们“根”模板。
你的 IWizard
实现需要保留对 EnvDTE.DTE
的引用对象(RunStarted
的第一个参数)并在 ProjectFinishedGenerating
中使用它使用与用户选择相匹配的模板将项目添加到解决方案。
public class SelectTemplatesWizard : IWizard
{
private EnvDTE.DTE _dte = null;
private string _solutionDir = null;
private string _templateDir = null;
public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
{
// Store the reference to the environment for later use
_dte = automationObject as EnvDTE.DTE;
/*
The value of the item in the replacements dictionary for the key
$destinationdirectory$ is populated with the physical location of
the directory (named based on the user entered project name) created
sibling to the solution file.
The solution directory will be this directories parent
when the Type attribute of the VSTemplate element is ProjectGroup
*/
_solutionDir = System.IO.Path.GetDirectoryName(replacementsDictionary["$destinationdirectory$"]);
// customParams[0] is a default custom param that contains the physical location of the template that is currently being applied
_templateDir = System.IO.Path.GetDirectoryName(customParams[0] as string);
}
public void ProjectFinishedGenerating(Project project)
{
int userSelected = 1;
string name= null, projectPath= null, templatePath = null;
switch (userSelected)
{
case 0:
{
name = "Angular";
projectPath = System.IO.Path.Combine(_solutionDir, "Angular");
templatePath = System.IO.Path.Combine(_templateDir , "Angular\Angular.vstemplate");
}
break;
case 1:
{
name = "MVC4";
projectPath = System.IO.Path.Combine(_solutionDir, "MVC4");
templatePath = System.IO.Path.Combine(_templateDir , "MVC4\MVC4.vstemplate");
}
break;
}
_dte.Solution.AddFromTemplate(templatePath, projectPath, name);
}
/* Other IWizard methods excluded for brevity */
}
关于vsix - 如何有选择地应用 VSTemplate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18663989/
我是一名优秀的程序员,十分优秀!