私は自分のチーム用にいくつかのカスタムプロジェクトテンプレートを作成しようとしています。これにより、アプリケーションの新しいモジュールの作成に一貫性を持たせることができ、新しいモジュールの作成も簡単になります。私はほとんどそれを機能させていますが、プロジェクト参照の追加に問題があります。
私はこのようなプロジェクト構造を目指しています:
/Root
/Modules
/ModuleName
/ModuleName.Interface
/ModuleName.ViewModels
/ModuleName.Views
ModuleNameプロジェクトには、それらすべてへのプロジェクト参照があり、ModuleName.Viewsプロジェクトには、ModuleName.InterfaceプロジェクトとModuleName.ViewModelsプロジェクトへの参照があります。したがって、すべてのvstemplateファイルを設定しました。プロジェクト参照を除いて、すべてのプロジェクトが正しく生成されます。
モジュールのメインvstemplateでこれを定義しています。
<TemplateContent>
<ProjectCollection>
<ProjectTemplateLink ProjectName="$safeprojectname$.Interface">Module.Interface\Module.Interface.vstemplate</ProjectTemplateLink>
<ProjectTemplateLink ProjectName="$safeprojectname$">Module\Module.vstemplate</ProjectTemplateLink>
<ProjectTemplateLink ProjectName="$safeprojectname$.ViewModels">Module.ViewModels\Module.ViewModels.vstemplate</ProjectTemplateLink>
<ProjectTemplateLink ProjectName="$safeprojectname$.Views">Module.Views\Module.Views.vstemplate</ProjectTemplateLink>
</ProjectCollection>
</TemplateContent>
Module.Views.vstemplateファイルでこれを定義しています。
<Project File="Module.Views.csproj" TargetFileName="$safeprojectname$.Views.csproj" ReplaceParameters="true">
<ProjectItem TargetFileName="packages.config" ReplaceParameters="false">packages.config</ProjectItem>
<ProjectItem TargetFileName="assemblyinfo.cs" ReplaceParameters="true">properties\assemblyinfo.cs</ProjectItem>
</Project>
次に、Module.Views.csprojファイルでこれを定義します。
<ItemGroup>
<ProjectReference Include="..\$safeprojectname$.Interface\$safeprojectname$.Interface.csproj">
<Project>{4f6aa0f2-a984-43c3-8fad-7e2f00351f7e}</Project>
<Name>$safeprojectname$.Interface</Name>
</ProjectReference>
<ProjectReference Include="..\$safeprojectname$.ViewModels\$safeprojectname$.ViewModels.csproj">
<Project>{e5a562f9-58b2-4ab5-bb9d-8dc806322e62}</Project>
<Name>$safeprojectname$.ViewModels</Name>
</ProjectReference>
</ItemGroup>
すべてのプロジェクトに正しく名前が付けられていますが、私のプロジェクト参照は次のようになります。
ModuleName.Views.Interface
ModuleName.Views.ViewModels
$ safeprojectname $マクロは、vstemplateファイルとcsprojファイルに適用すると動作が異なるように見えます。vstemplateファイルを処理しているとき、$ safeprojectname $はIDEによってプロンプトが表示されたときに入力したプロジェクトの名前のようですが、csprojファイルでは$ safeprojectname $はそのvstemplateに固有の拡張プロジェクト名です(例:ModuleName.Views when I ModuleNameであると期待していました。
CustomParametersを使用しようとしましたが、最後の最後まで延期されているようです。例:
<CustomParameters>
<CustomParameter Name="$ModuleInterfaceProjectName$" Value="$safeprojectname$.Interface"/>
<CustomParameter Name="$ModuleProjectName$" Value="$safeprojectname$"/>
<CustomParameter Name="$ModuleViewModelsProjectName$" Value="$safeprojectname$.ViewModels"/>
<CustomParameter Name="$ModuleViewsProjectName$" Value="$safeprojectname$.Views"/>
</CustomParameters>
これにより、ModuleName.Views.Interfaceへの同じ参照が生成されます。
誰かがこの動作を回避する方法を知っていますか?これを修正するためのカスタムウィザードを作成できることは知っていますが、それほど遠くまでは行かないことを望んでいました。