【问题标题】:.NET Core Multi-Project Template - Renaming Project Reference.NET Core 多项目模板 - 重命名项目参考
【发布时间】:2020-01-22 16:11:29
【问题描述】:

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

我设置了一个 vsix 安装程序,它接收压缩后的内容,安装后一切正常,几乎可以。我不知道如何将 UnitTests 项目中的项目引用重命名为用户指定的项目名称。我已经尝试过 $safeprojectname$,但这会产生“UnitTests”,因为它是在该项目的上下文中。我已经通过所有默认参数无济于事。我需要的是“masterprojectname”之类的东西。我尝试使用 customParameter(请参阅下面的 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="..\ProjA\ProjA.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$">
                ProjA\ProjA.vstemplate
            </ProjectTemplateLink>
            <ProjectTemplateLink ProjectName="UnitTests">
                UnitTests\UnitTests.vstemplate
            </ProjectTemplateLink>
        </ProjectCollection>
        <CustomParameters>
          <CustomParameter Name="$parentproject$" Value="$safeprojectname$" />
        </CustomParameters>
    </TemplateContent>
</VSTemplate>

【问题讨论】:

    标签: templates .net-core


    【解决方案1】:

    只是想提一下我通过使用here提供的答案解决了这个问题。

    基本上,我必须使用 &lt;ProjectTemplateLink ProjectName="$projectname$.UnitTests" CopyParameters="true"&gt;(注意CopyParameters="true")。然后,在我的 UnitTests.csproj 文件中,将 ProjectReference 修改为: &lt;ProjectReference Include="..\$ext_projectname$\$ext_projectname$.csproj" /&gt;

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

    【讨论】:

      【解决方案2】:

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


      简而言之:

      查看保留模板参数 - 参数 - ext_* in

      文档 - Visual Studio - IDE - 开发 - 解决方案和项目 - 自定义模板 - Template parameters

      我的测试结果参数值:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-17
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        • 2018-05-21
        • 2017-02-22
        相关资源
        最近更新 更多