1

我正在尝试为我的团队编写一些自定义项目模板,以便我们可以在为我们的应用程序创建新模块时保持一致,也可以更轻松地创建新模块。我大部分时间都在工作,但我在添加项目引用时遇到了问题。

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

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

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

4

0 回答 0