. NET Базовый шаблон мультипроекта - Справочник по переименованию проекта - PullRequest
0 голосов
/ 22 января 2020

У меня есть настроенный шаблон для нескольких проектов, который содержит 2. NET Основные проекты (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>

1 Ответ

0 голосов
/ 26 января 2020

Просто хотел упомянуть, что я обошел это, используя ответ, предоставленный здесь .

По сути, мне пришлось использовать <ProjectTemplateLink ProjectName="$projectname$.UnitTests" CopyParameters="true"> (обратите внимание на CopyParameters="true"). Затем в моем файле UnitTests.csproj изменил ProjectReference на: <ProjectReference Include="..\$ext_projectname$\$ext_projectname$.csproj" />

. CopyParameters="true" предоставляет переменную $ext_projectname$, которая содержит имя проекта, указанное в «диалоге создания нового проекта», доступны для проекта UnitTests.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...