次の2つのプロジェクト(を含むソリューションの マルチプロジェクトテンプレート を作成できるようにしたいと思います。ここで、インターフェイスにはビジネスレイヤーへの参照が含まれている必要があります).:
<proj_name>.interface
<proj_name>.business
。通常、 $safeprojectname$
を含めることができます。
[新しいプロジェクト]ダイアログボックスでユーザーが指定した名前
ただし、記事で指摘されているように マルチプロジェクトのビジュアルスタジオテンプレートを作成する
ここでの問題は、各子テンプレート内で、$ safeprojectname $が現在のプロジェクト名を表すことです。親テンプレートからルート$ safeprojectname $を渡す方法が必要です。
このSO質問 VS 2010マルチプロジェクトテンプレート:プロジェクト間参照 で提案されているソリューションを、 CustomParameters
ですが、問題が発生しています。
圧縮されたテンプレートディレクトリは次のようになります:
ディレクトリ全体 をダウンロードできますが、ここにいくつかの抜粋スニペットがあります
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>
タグ値を置換する方法を理解できる場合はボーナスポイント。
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>
完全開示:私は下記のプロジェクトの作成者です。
マルチプロジェクトテンプレート内のプロジェクトテンプレート間で情報を共有する問題を解決し、 IWizard 実装 GlobalParams を作成しました。ソリューションテンプレートレベルの情報を、[〜#〜] all [〜#〜]というプレフィックスを付けてウィザードを実行する子テンプレートで利用できるようにします。 Wordglobalを使用してソリューションレベルのパラメーターを作成し、それを子パラメーターに追加します。
上記のテンプレートで GlobalParams を使用し、ユーザーが「Test Project」と入力した場合、次のようになります。
$safeprojectname$
= Test_Project.Interface$globalsafeprojectname$
= Test_Project$safeprojectname$
= Test_Project.Business$globalsafeprojectname$
= Test_Project上記は安全なプロジェクト名の例ですが、ソリューションテンプレートのすべてのパラメーターは子テンプレートに渡されます。詳細については、 GlobalParamsドキュメント を参照してください。