不能使用" root"多项目vsTemplate中项目的名称

时间:2015-03-05 18:37:54

标签: c# .net visual-studio

我创建了一个多项目模板。 我可以使用我想要的名称创建项目。 但是对于项目中的项目,他们总是在变量替换期间获得项目的全名,而我只想使用项目名称的根部分。

我的解决方案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 $来使其工作。

干杯。

1 个答案:

答案 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>

现在一切都按照我想要的方式运作。

我花了太多时间搞清楚这一点,所以我希望它可以帮助那些人。