如何在BuiltProjectOutputGroup中包含项目

时间:2017-04-08 15:23:15

标签: msbuild .net-core dotnet-cli dotnet-sdk

我有一个自定义项目系统,它使用标准的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 个答案:

答案 0 :(得分: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>