在 AfterBuild 目标中插入 CallTarget 节点的 NuGet 包安装

NuGet package install that inserts CallTarget nodes in the AfterBuild Target

我已经构建了一个 NuGet 包,用于打包托管和非托管依赖项,其中一些是 运行时间依赖项,因此我的 .targets 文件中有几个目标用于复制这些依赖项的 NuGet 文件到使用 NuGet 包的项目的 bin 文件夹,我希望消费者不必手动将 CallTarget 节点插入到他们的 .csproj 文件中。

我的包的 .targets 文件如下所示:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
  <Target Name="CopyDeviceIntegrationNativeDependencies"> 
    <Message Text="Copying Device Integration native dependencies to $(OutDir)..." Importance="high" />
    <ItemGroup> 
      <TDDeviceIntegrationNativeDependencies Include="$(MSBuildProjectDirectory)\..\Packages\TDDeviceIntegration*\lib\native\**\*.*" /> 
    </ItemGroup> 
    <Copy SourceFiles="@(TDDeviceIntegrationNativeDependencies)" DestinationFiles="@(TDDeviceIntegrationNativeDependencies->'$(OutDir)\%(Filename)%(Extension)')" ></Copy> 
  </Target> 
  <Target Name="CopyDeviceIntegrationContentDependencies">
      <Message Text="Copying Device Integration content dependencies to $(OutDir)..." Importance="high" />
      <ItemGroup>
          <TDDeviceIntegrationContentDependencies Include="$(MSBuildProjectDirectory)\..\Packages\TDDeviceIntegration*\content\**\*.*" />
      </ItemGroup>
      <Copy SourceFiles="@(TDDeviceIntegrationContentDependencies)" DestinationFiles="@(TDDeviceIntegrationContentDependencies->'$(OutDir)\%(Filename)%(Extension)')" ></Copy>
  </Target>
  <Target Name="CopyDeviceIntegrationManagedDependencies">
      <Message Text="Copying Device Integration managed dependencies to $(OutDir)..." Importance="high" />
      <ItemGroup>
          <TDDeviceIntegrationManagedDependencies Include="$(MSBuildProjectDirectory)\..\Packages\TDDeviceIntegration*\lib\*.*" />
      </ItemGroup>
      <Copy SourceFiles="@(TDDeviceIntegrationManagedDependencies)" DestinationFiles="@(TDDeviceIntegrationManagedDependencies->'$(OutDir)\%(Filename)%(Extension)')"></Copy>
  </Target>
</Project>

我的消费 .csproj 文件需要包含此内容才能进行这些复制:

  <Target Name="AfterBuild">
    <CallTarget Targets="CopyDeviceIntegrationNativeDependencies" />
    <CallTarget Targets="CopyDeviceIntegrationContentDependencies" />
    <CallTarget Targets="CopyDeviceIntegrationManagedDependencies" />
  </Target>

考虑到这个 .csproj 文件中只能有一个 AfterBuild 目标这一事实(据我所知),我是否可以为消费者插入那些 CallTarget 节点安装 NuGet 包后,消费者不必手动添加它们?我从来没有 运行 遇到强制消费者必须在安装后更改其 .csproj 文件的 NuGet 包。

谢谢!

您可以将所有目标挂接到构建本身,不需要项目作者进行任何更改:

<Target Name="Foo" AfterTargets="AfterBuild"> …

请注意,您似乎只想将文件包含到输出目录中,这可以在没有目标作为静态项组的情况下完成:

<ItemGroup>
  <Content Include="$(MSBuildThisFileDirectory)path\relativetotargetsfile\somecontent\**"
      Link="\%(Filename)%(Extension)"
      Visible="false"
      CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

这将支持增量构建。如果您需要将内容放入子目录,请更改 Link 元数据。