具有多个项目的Visual Studio自定义项目模板

时间:2012-12-24 04:09:19

标签: visual-studio templates

我正在尝试为我的团队编写一些自定义项目模板,这样我们就可以在为应用程序创建新模块时保持一致,同时也可以更轻松地创建新模块。我主要使用它,但我在添加项目引用时遇到问题。

我的目标是这样的项目结构:

/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的相同引用。

有谁知道如何解决这种行为?我知道我可以写一个自定义向导来解决这个问题,但我希望不要那么远。

0 个答案:

没有答案