【问题标题】:NuGet package install that inserts CallTarget nodes in the AfterBuild Target在 AfterBuild 目标中插入 CallTarget 节点的 NuGet 包安装
【发布时间】:2018-03-15 19:20:40
【问题描述】:

我已经构建了一个 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 目标(据我所知),无论如何我可以在安装 NuGet 包时为消费者插入那些 CallTarget 节点这样消费者就不必手动添加它们了吗?我从未遇到过强制消费者在安装后必须更改其 .csproj 文件的 NuGet 包。

谢谢!

【问题讨论】:

    标签: c# msbuild nuget nuget-package target


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我认为第一个建议是最干净的。你会同意吗?澄清一下,第二个建议将放在 .csproj 文件中,仍然需要消费者手动执行,对吗?
    • 我正在考虑创建一个build\PackageName.targets 文件,以便将其自动导入到使用项目中
    • 哦,哇,好吧,那也行。您认为其中一个比另一个有优势吗?
    • 所有工具都将其视为要输出的项目,因此它应该可以在项目引用中正常工作。增量构建也适用于 CopyToOutputDirectory 元数据的 PreserveNewest,必须修改 &lt;Copy&gt; 任务以使其增量(= 避免在增量构建期间过度复制)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    相关资源
    最近更新 更多