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