我有Nuget包,其中包含非托管DLL和目标,以将此DLL复制到输出文件夹:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="AfterBuild" DependsOnTargets="CopyFilesToOutputDirectory">
<ItemGroup>
<MyPackageSourceFile Include="$(SolutionDir)\packages\somepackage\unmanaged\*.dll" />
</ItemGroup>
<Copy SourceFiles="@(MyPackageSourceFile)" DestinationFolder="$(OutputPath)" />
</Target>
</Project>
当我构建项目(使用Visual Studio)
时,这非常有效但是,如果我想创建发布包(To File System,或者再次使用VS进行Web部署),则不包括这些dll。
有什么建议吗?
答案 0 :(得分:2)
将Nuget包中的非托管DLL包含到Web部署包
您可以在NuGet包中的目标AfterBuild
之后添加另一个目标,以将这些非托管DLL文件动态地包含到项目文件中,或者将目标简单地添加到项目文件中。
要完成此操作,请在NuGet包中添加目标订单为AfterTargets="AfterBuild"
的目标:
<Target Name="AddUnmanagedDll" AfterTargets="AfterBuild">
<ItemGroup>
<Content Include="$(OutputPath)\*.dll" />
</ItemGroup>
</Target>
但是这个目标会添加所有的dll文件,包括托管的dll文件。要解决此问题,我们需要更改以前的目标AfterBuild以添加另一个复制任务,以将这些非托管dll文件复制到单独的文件夹:
<Target Name="AfterBuild" DependsOnTargets="CopyFilesToOutputDirectory">
<ItemGroup>
<MyPackageSourceFile Include="$(SolutionDir)packages\somepackage\unmanaged\*.dll" />
</ItemGroup>
<Copy SourceFiles="@(MyPackageSourceFile)" DestinationFolder="$(OutputPath)" />
<Copy SourceFiles="@(MyPackageSourceFile)" DestinationFolder="$(ProjectDir)UnmanagedDll" />
</Target>
添加另一个复制任务<Copy SourceFiles="@(MyPackageSourceFile)" DestinationFolder="$(ProjectDir)UnmanagedDll" />
后,将非托管dll文件复制到单独的文件夹$(ProjectDir)UnmanagedDll
。
然后我们可以将目标<Content Include="$(OutputPath)\*.dll" />
中的ItemGroup AddUnmanagedDll
更改为<Content Include="UnmanagedDll\*.dll" />
因此NuGet包中的目标应为:
<Target Name="AfterBuild" DependsOnTargets="CopyFilesToOutputDirectory">
<ItemGroup>
<MyPackageSourceFile Include="$(SolutionDir)packages\app.1.0.0\unmanaged\*.dll" />
</ItemGroup>
<Copy SourceFiles="@(MyPackageSourceFile)" DestinationFolder="$(OutputPath)" />
<Copy SourceFiles="@(MyPackageSourceFile)" DestinationFolder="$(ProjectDir)UnmanagedDll" />
</Target>
<Target Name="AddUnmanagedDll" AfterTargets="AfterBuild">
<ItemGroup>
<Content Include="UnmanagedDll\*.dll" />
</ItemGroup>
</Target>
发布项目后,那些未受管理的项目将包含在Web Deploy包中: