我正在尝试为我的团队编写一些自定义项目模板,以便我们可以在为我们的应用程序创建新模块时保持一致,也可以更轻松地创建新模块。我大部分时间都在工作,但我在添加项目引用时遇到了问题。
我的目标是这样的项目结构:
/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 当我期望它是 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 的相同引用。
有谁知道如何解决这种行为?我知道我可以编写一个自定义向导来解决这个问题,但我希望不要走那么远。