Как включить элемент в 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="
 BuiltProjectOutputGroup;
 DebugSymbolsProjectOutputGroup;
 DocumentationProjectOutputGroup;
 SatelliteDllsProjectOutputGroup;
 SourceFilesProjectOutputGroup;
 ContentFilesProjectOutputGroup;
 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>