【问题标题】:How to include an item in BuiltProjectOutputGroup如何在 BuiltProjectOutputGroup 中包含一个项目
【发布时间】:2017-04-08 15:23:14
【问题描述】:

我有一个自定义项目系统,它使用标准的 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 目标总是最后导入,覆盖我声明的任何内容。

非常感谢任何指导。

【问题讨论】:

  • 我认为您的标题应该是“... in BuiltProjectOutputGroupKeyOutput”,而不是 BuiltProjectOutputGroup。后者是一个目标。也许也可以查看它的代码(以及其他依赖项):一些目标对其 DependOnTargets 使用属性,因此您可以将该属性设置为您的目标之一,然后您就可以设置了。
  • 谢谢@stijn,我终于到了那里,我发现内容输出组目标使用一个属性作为它的依赖项,所以我设法将我的目标添加到那个。

标签: msbuild .net-core dotnet-cli dotnet-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>

【讨论】:

  • 谢谢,我设法找到了另一种方法,但我会接受这个答案!
  • - 以及另一种方法,涉及发现某些输出组目标具有相应的“依赖”属性。您可以通过使用包含您自己的目标的属性覆盖此依赖属性来挂钩它们,然后在该目标中,您可以在该输出组中包含其他项目。例如,内容输出组使用这种机制。不确定他们是否都这样做,但如果他们没有,那么很确定你的答案仍然有效。
猜你喜欢
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
相关资源
最近更新 更多