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

时间:2018-03-15 19:20:40

标签: c# msbuild nuget nuget-package target

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

我的包的.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包。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

请注意,您似乎只想将文件包含到输出目录中,这可以不使用目标作为静态项目组来完成:

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

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