我创建了一个多项目模板。 我可以使用我想要的名称创建项目。 但是对于项目中的项目,他们总是在变量替换期间获得项目的全名,而我只想使用项目名称的根部分。
我的解决方案vstemplate就是这样:
<VSTemplate Version="3.0.0" Type="ProjectGroup"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>My Template</Name>
<Description>Solution template</Description>
<Icon>Icon.png</Icon>
<ProjectType>CSharp</ProjectType>
</TemplateData>
<TemplateContent>
<ProjectCollection>
<ProjectTemplateLink ProjectName="$safeprojectname$.DataModel">
APP.DataModel\ProjectTemplate.vstemplate
</ProjectTemplateLink>
</ProjectCollection>
</TemplateContent>
</VSTemplate>
,项目模板是:
<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
<TemplateData>
<Name>DataModel</Name>
<ProjectType>CSharp</ProjectType>
<ProjectSubType>
</ProjectSubType>
<SortOrder>1000</SortOrder>
</TemplateData>
<TemplateContent>
<Project TargetFileName="$saferootprojectname$.DataModel.csproj" File="APP.DataModel.csproj" ReplaceParameters="true">
<ProjectItem ReplaceParameters="true" TargetFileName="$safeprojectname$.cs">MyClass.cs</ProjectItem>
</Project>
</TemplateContent>
</VSTemplate>
当在向导中运行模板输入“foo”时,我按预期得到一个“foo.DataModel”项目。 在“foo.DataModel”项目中,文件“MyClass.cs”被重命名为“foo.DataModel.cs”而不是“foo.cs”,正如我所希望的那样。
我尝试了不同的可用变量但它没有用。 我试图使用自定义参数,但也不起作用。 我甚至创建了一个向导来添加我自己的变量,但是如果我不在其他任何地方使用它(并且模板失败),它或者没有拿起替换值,或者如果我使用它给我与“foo.DataModel”相同的结果项目名称中的替换变量。
我的项目模板存在类似问题,但我可以使用$ fileinputname $和$ safeitemname $来使其工作。
干杯。
答案 0 :(得分:0)
我找到了一种方法来获得我想要的东西。
我创建了一个IWizard并为每个项目覆盖$safeprojectname$
,如下所示:
private static string basename;
public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
{
if (runKind == WizardRunKind.AsMultiProject)
{
basename = replacementsDictionary["$specifiedsolutionname$"];
}
else
{
replacementsDictionary["$safeprojectname$"] = basename;
}
}
然后我向每个模板(解决方案和每个项目模板)添加了对向导(必须是GAc-ed)的引用。
解决方案模板:
<VSTemplate Version="3.0.0" Type="ProjectGroup"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>My Template</Name>
<Description>Solution template</Description>
<Icon>Icon.png</Icon>
<ProjectType>CSharp</ProjectType>
</TemplateData>
<TemplateContent>
<ProjectCollection>
<ProjectTemplateLink ProjectName="$safeprojectname$.DataModel">
APP.DataModel\ProjectTemplate.vstemplate
</ProjectTemplateLink>
</ProjectCollection>
</TemplateContent>
<WizardExtension>
<Assembly>Wizard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=97aaf9683a0dbe2b</Assembly>
<FullClassName>Wizard.Wizard</FullClassName>
</WizardExtension>
</VSTemplate>
项目模板:
<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
<TemplateData>
<Name>DataModel</Name>
<ProjectType>CSharp</ProjectType>
<ProjectSubType>
</ProjectSubType>
<SortOrder>1000</SortOrder>
</TemplateData>
<TemplateContent>
<Project TargetFileName="$saferootprojectname$.DataModel.csproj" File="APP.DataModel.csproj" ReplaceParameters="true">
<ProjectItem ReplaceParameters="true" TargetFileName="$safeprojectname$.cs">MyClass.cs</ProjectItem>
</Project>
</TemplateContent>
<WizardExtension>
<Assembly>Wizard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=97aaf9683a0dbe2b</Assembly>
<FullClassName>Wizard.Wizard</FullClassName>
</WizardExtension>
</VSTemplate>
现在一切都按照我想要的方式运作。
我花了太多时间搞清楚这一点,所以我希望它可以帮助那些人。