我已经构建了一个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包。
谢谢!
答案 0 :(得分:1)
您可以将所有目标挂钩到构建中,而不需要项目作者进行任何更改:
<Target Name="Foo" AfterTargets="AfterBuild"> …
请注意,您似乎只想将文件包含到输出目录中,这可以不使用目标作为静态项目组来完成:
<ItemGroup>
<Content Include="$(MSBuildThisFileDirectory)path\relativetotargetsfile\somecontent\**"
Link="\%(Filename)%(Extension)"
Visible="false"
CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
这将支持增量构建。如果您需要将内容放入子目录,请更改Link
元数据。