web-dev-qa-db-ja.com

VisualStudioマルチプロジェクトテンプレートでのCustomParameterの使用

次の2つのプロジェクト(を含むソリューションの マルチプロジェクトテンプレート を作成できるようにしたいと思います。ここで、インターフェイスにはビジネスレイヤーへの参照が含まれている必要があります).:

  • <proj_name>.interface
  • <proj_name>.business

通常、 $safeprojectname$ を含めることができます。

[新しいプロジェクト]ダイアログボックスでユーザーが指定した名前

ただし、記事で指摘されているように マルチプロジェクトのビジュアルスタジオテンプレートを作成する

ここでの問題は、各子テンプレート内で、$ safeprojectname $が現在のプロジェクト名を表すことです。親テンプレートからルート$ safeprojectname $を渡す方法が必要です。

このSO質問 VS 2010マルチプロジェクトテンプレート:プロジェクト間参照 で提案されているソリューションを、 CustomParameters ですが、問題が発生しています。

圧縮されたテンプレートディレクトリは次のようになります:

  • MultiTemplate.vstemplate
  • インターフェース
    • InterfaceTemplate.vstemplate
    • MyTemplate.Interface.csproj
  • ビジネス
    • BusinessTemplate.vstemplate
    • MyTemplate.Business.csproj

ディレクトリ全体 をダウンロードできますが、ここにいくつかの抜粋スニペットがあります

MultiTemplate.vstemplate

<VSTemplate Version="3.0.0" xmlns="http://schemas.Microsoft.com/developer/vstemplate/2005" Type="ProjectGroup">
  <TemplateData><!--Removed for brevity --></TemplateData>
  <TemplateContent>
    <CustomParameters>
      <CustomParameter Name="$SolutionName$" Value="$safeprojectname$"/>
    </CustomParameters>
    <ProjectCollection>
      <ProjectTemplateLink ProjectName="$safeprojectname$.Interface">
        Interface\InterfaceTemplate.vstemplate
      </ProjectTemplateLink>
      <ProjectTemplateLink ProjectName="$safeprojectname$.Business">
        Business\BusinessTemplate.vstemplate
      </ProjectTemplateLink>
    </ProjectCollection>
  </TemplateContent>
</VSTemplate>

Interface\InterfaceTemplate.vstemplate

<VSTemplate Version="3.0.0" xmlns="http://schemas.Microsoft.com/developer/vstemplate/2005" Type="Project">
  <TemplateData><!--Removed for brevity --></TemplateData>
  <TemplateContent>
    <Project TargetFileName="MyTemplate.Interface.csproj" 
             File="MyTemplate.Interface.csproj"
             ReplaceParameters="true">
    </Project>
  </TemplateContent>
</VSTemplate>

MyTemplate.Interface.csproj

<ItemGroup>
  <ProjectReference Include="..\$SolutionName$.Business\$SolutionName$.Business.csproj">
    <Project>{E5511F75-5B9C-4816-B991-E09225661CF4}</Project>
    <Name>MyTemplate.Business</Name>
  </ProjectReference>
</ItemGroup>

問題

新しいプロジェクトを作成しても、文字列の$SolutionName$部分は置き換えられません。代わりに、それは同じままです。

[〜#〜] q [〜#〜]マルチプロジェクトテンプレートからこの情報を適切に渡すにはどうすればよいですか?子テンプレートのそれぞれに?

トークンの置換は機能していないように見えるため、<name>タグ値を置換する方法を理解できる場合はボーナスポイント。

32
KyleMit

Visual Studio 2013 Update 2は、これを行うための組み込みの方法をついに追加しました ProjectTemplateLink

CopyParameters属性は、接頭辞ext_を付けて親テンプレートのすべての変数に子がアクセスできるようにします。

このためにCustomParametersも必要ありません。 ProjectTemplateLinkを次のように変更します。

<ProjectTemplateLink ProjectName="$safeprojectname$.Interface" CopyParameters="true">
  Interface\InterfaceTemplate.vstemplate
</ProjectTemplateLink>

そして、あなたは次のように子供.csprojであなたの目標を達成することができます:

<ItemGroup>
  <ProjectReference Include="..\$ext_safeprojectname$.Business\$ext_safeprojectname$.Business.csproj">
    <Project>{E5511F75-5B9C-4816-B991-E09225661CF4}</Project>
    <Name>MyTemplate.Business</Name>
  </ProjectReference>
</ItemGroup>
68
friggle

完全開示:私は下記のプロジェクトの作成者です。

マルチプロジェクトテンプレート内のプロジェクトテンプレート間で情報を共有する問題を解決し、 IWizard 実装 GlobalParams を作成しました。ソリューションテンプレートレベルの情報を、[〜#〜] all [〜#〜]というプレフィックスを付けてウィザードを実行する子テンプレートで利用できるようにします。 Wordglobalを使用してソリューションレベルのパラメーターを作成し、それを子パラメーターに追加します。

上記のテンプレートで GlobalParams を使用し、ユーザーが「Test Project」と入力した場合、次のようになります。

  • InterfaceTemplate.vstemplateがアクセスできました
    • $safeprojectname$ = Test_Project.Interface
    • $globalsafeprojectname$ = Test_Project
  • BusinessTemplate.vstemplateがアクセスできました
    • $safeprojectname$ = Test_Project.Business
    • $globalsafeprojectname$ = Test_Project

上記は安全なプロジェクト名の例ですが、ソリューションテンプレートのすべてのパラメーターは子テンプレートに渡されます。詳細については、 GlobalParamsドキュメント を参照してください。

3
Troy Palacino