Как включить элемент в BuiltProjectOutputGroup

У меня есть собственная система проектов, которая использует стандартные цели net sdk. Во время сборки я создаю дополнительный zip-файл. Мне бы хотелось, чтобы этот дополнительный файл был включен в группу вывода, чтобы при запросе групп вывода моих проектов (из vs) он отображался.

Мой файл проекта выглядит так:

<Project Sdk="Microsoft.NET.Sdk"> 
 ... stuff
  <ItemGroup>
    <PackageReference Include="DnnVsProjectSystem.BuildTools" Version="0.0.5">
      <PrivateAssets>All</PrivateAssets>
    </PackageReference>
  </ItemGroup>
  <Import Project="$(CustomProjectExtensionsPath)DnnVsProjectSystem.targets"/>
</Project>

Обратите внимание, я использую атрибут "sdk", который является довольно новой функцией msbuild.

PackageReference что вы видите, это пакет nuget, который импортирует.props и.targets, которые augment сборка с некоторыми пользовательскими задачами сборки. Это те, которые производят zip-файл.

Я сверлил в net sdk цели и нашли это:

<Target Name="AllProjectOutputGroups" DependsOnTargets="&#xD;&#xA;            BuiltProjectOutputGroup;&#xD;&#xA;            DebugSymbolsProjectOutputGroup;&#xD;&#xA;            DocumentationProjectOutputGroup;&#xD;&#xA;            SatelliteDllsProjectOutputGroup;&#xD;&#xA;            SourceFilesProjectOutputGroup;&#xD;&#xA;            ContentFilesProjectOutputGroup;&#xD;&#xA;            SGenFilesOutputGroup" />
  <!--
    This is the key output for the BuiltProjectOutputGroup and is meant to be read directly from the IDE.
    Reading an item is faster than invoking a target.
    -->
  <ItemGroup Condition=" '$(OutputType)' != 'winmdobj' ">
    <BuiltProjectOutputGroupKeyOutput Include="@(IntermediateAssembly->'%(FullPath)')">
      <IsKeyOutput>true</IsKeyOutput>
      <FinalOutputPath>$(TargetPath)</FinalOutputPath>
      <TargetPath>$(TargetFileName)</TargetPath>
      <COM2REG Condition="'$(RegisterForComInterop)'=='true' and '$(OutputType)'=='library'">true</COM2REG>
    </BuiltProjectOutputGroupKeyOutput>
  </ItemGroup>
  <ItemGroup Condition=" '$(OutputType)' == 'winmdobj' ">
    <WinMDExpOutputWindowsMetadataFileItem Include="$(_IntermediateWindowsMetadataPath)" Condition="'$(_IntermediateWindowsMetadataPath)' != ''" />
    <BuiltProjectOutputGroupKeyOutput Include="@(WinMDExpOutputWindowsMetadataFileItem->'%(FullPath)')">
      <IsKeyOutput>true</IsKeyOutput>
      <FinalOutputPath>$(TargetPath)</FinalOutputPath>
      <TargetPath>$(TargetFileName)</TargetPath>
    </BuiltProjectOutputGroupKeyOutput>
  </ItemGroup>

Похоже, это цель, которая вызывается VS, когда она хочет получить информацию о группах вывода.

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

Я также не могу переопределить ни одну из целей, потому что, поскольку я использую sdk атрибут, похоже, цели sdk всегда будут импортироваться последними, перезаписывая все, что я объявляю.

Любое руководство высоко ценится.

1 ответ

Решение

Если ваша единственная задача состоит в том, чтобы подключиться к цели или ее цепочке зависимостей, я предлагаю использовать msbuild BeforeTargets функциональность:

<Target Name="IncludeMyCustomOutputGroup" BeforeTargets="AllProjectOutputGroups" DependsOnTargets="ResolveMyCustomPropertiesAndItems">
  <ItemGroup>
    <!-- Assuming @(MyCustomOutput) items are generated by your ResolveMyCustomPropertiesAndItems target, or just add anything else -->
    <BuiltProjectOutputGroupKeyOutput Include="@(MyCustomOutput->'%(FullPath)')">
      <IsKeyOutput>true</IsKeyOutput>
      <FinalOutputPath>$(TargetPath)</FinalOutputPath>
      <TargetPath>$(TargetFileName)</TargetPath>
    </BuiltProjectOutputGroupKeyOutput>
  </ItemGroup>
</Target>
Другие вопросы по тегам