.NET Core 多项目模板 - 重命名项目引用



我设置了一个多项目模板,其中包含 2 个 .NET Core 项目(ProjA.csproj 和 UnitTests.csproj(。每个都包含在自己的文件夹中,并带有自己相应的vstemplate(分别为ProjA.vstemplate和UnitTests.vstemplate(,我有一个root.vstemplate将它们捆绑在一起。UnitTests 项目包含对 ProjA 的项目引用。我的文件夹结构如下所示:文件夹结构

我设置了一个 vsix 安装程序,可以接收压缩的内容,安装后一切正常,几乎。我不知道如何在将 UnitTests 项目中的项目引用重命名为用户指定的项目名称。我已经尝试了$safeprojectname$,但这会产生"单元测试",因为它是在该项目的上下文中。我已经完成了所有默认参数,但无济于事。我需要的是类似于"主项目名称"的东西。我尝试使用自定义参数(请参阅下面的Root.vstemplate(,但这也没有用。

这是我的UnitTests.csproj内容:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<IsPackable>false</IsPackable>
<RootNamespace>UnitTests</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.0.0" />
<PackageReference Include="Moq" Version="4.12.0" />
<PackageReference Include="nunit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.11.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..ProjAProjA.csproj" />
<!-- I've tried the following but it yields "UnitTests": -->
<!-- <ProjectReference Include="..$safeprojectname$$safeprojectname$.csproj" /> -->
<!-- Also tried the following with a customParameter in Root.vstemplate, but it didn't work -->
<!-- <ProjectReference Include="..$parentproject$$parentproject$.csproj" /> -->
</ItemGroup>
</Project>

这是我的UnitTests.vstemplate:

<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
<TemplateData>
<Name>UnitTests</Name>
<Description>Creates a standard UnitsTest project</Description>
<ProjectType>CSharp</ProjectType>
<SortOrder>110</SortOrder>
<CreateNewFolder>true</CreateNewFolder>
<DefaultName>UnitTests</DefaultName>
<ProvideDefaultName>true</ProvideDefaultName>
<LocationField>Enabled</LocationField>
<EnableLocationBrowseButton>true</EnableLocationBrowseButton>
<CreateInPlace>true</CreateInPlace>
<Hidden>true</Hidden>
</TemplateData>
<TemplateContent>
<Project TargetFileName="UnitTests.csproj" File="UnitTests.csproj" ReplaceParameters="true">
<Folder Name="Business" TargetFolderName="Business">
<ProjectItem ReplaceParameters="true" TargetFileName="TestsTemplate.cs">TestsTemplate.cs</ProjectItem>
</Folder>
</Project>
</TemplateContent>
</VSTemplate>

这是我的Root.vstemplate:

<VSTemplate Version="3.0.0" Type="ProjectGroup" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>MessageListener Template (.NET Core)</Name>
<Description>Creates a boilerplate MessageListener</Description>
<ProjectType>CSharp</ProjectType>
<ProjectSubType>Console</ProjectSubType>
<SortOrder>10</SortOrder>
<CreateNewFolder>true</CreateNewFolder>
<DefaultName>REDACTED</DefaultName>
<ProvideDefaultName>true</ProvideDefaultName>
<LocationField>Enabled</LocationField>
<EnableLocationBrowseButton>true</EnableLocationBrowseButton>
<Icon>CS.png</Icon>
<LanguageTag>C#</LanguageTag>
<PlatformTag>Linux</PlatformTag>
<PlatformTag>macOS</PlatformTag>
<PlatformTag>Windows</PlatformTag>
<ProjectTypeTag>Console</ProjectTypeTag>
</TemplateData>
<TemplateContent>
<ProjectCollection>
<ProjectTemplateLink ProjectName="$safeprojectname$">
ProjAProjA.vstemplate
</ProjectTemplateLink>
<ProjectTemplateLink ProjectName="UnitTests">
UnitTestsUnitTests.vstemplate
</ProjectTemplateLink>
</ProjectCollection>
<CustomParameters>
<CustomParameter Name="$parentproject$" Value="$safeprojectname$" />
</CustomParameters>
</TemplateContent>
</VSTemplate>

只是想提一下,我通过使用此处提供的答案来解决这个问题。

基本上,我不得不使用<ProjectTemplateLink ProjectName="$projectname$.UnitTests" CopyParameters="true">(注意CopyParameters="true"(。然后,在我的 UnitTests.csproj 文件中,将项目引用修改为:<ProjectReference Include="..$ext_projectname$$ext_projectname$.csproj" />

CopyParameters="true"公开$ext_projectname$变量,该变量包含在"创建新项目对话框"中指定的项目名称,可用于 UnitTests 项目。

检查我的答案。 https://stackoverflow.com/a/65774847/15029912

<小时 />

简而言之:

请参阅保留模板参数 - 参数 - ext_*

文档 - 可视化工作室 - IDE - 开发 - 解决方案和项目 - 自定义模板 - 模板参数

我的测试的结果参数值:

$safeitemname$ = "Class1"
$safeprojectname$ = "SubProject1"
$ext_safeprojectname$ = "Nested"
$ext_ext_safeprojectname$ = "SolutionName"

最新更新