如何在.NET Standard 2.0 NuGet包中包含额外运行时文件?
问题分析与解决方案
当前方案存在多处错误,导致文件无法正确复制到消费者输出目录:
- 原生DLL打包路径错误:你将x86/x64的DLL放到
runtimes/win-x86/native,这是NuGet自动部署原生依赖的路径,不会按你期望的Special/x86/Special/x64结构存放,反而破坏了目标文件夹层级。 - 自定义targets未被打包:你没有配置将手写的.targets文件打包到NuGet的
buildTransitive目录,消费者项目根本不会加载这个文件,CopySpecialFiles任务从未执行。 - 复制任务未保留目录结构:原Copy任务把所有文件直接放到
$(OutDir)\Special下,会丢失x86/x64的子目录,无法还原原文件夹结构。 - 文件打包不完整:x86/x64的DLL未被打包到
buildTransitive/Special目录,targets文件找不到这些文件进行复制。
正确实现步骤
1. 调整类库项目的.csproj配置
将所有Special文件夹内容统一打包到buildTransitive/Special,同时确保自定义targets文件被打包到buildTransitive目录:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <PackageId>Package.A</PackageId> <!-- 补充你的NuGet包版本、作者等属性 --> </PropertyGroup> <!-- 打包Special文件夹下所有内容到buildTransitive/Special --> <ItemGroup> <None Include="Special\**" Pack="true" PackagePath="buildTransitive/Special" /> </ItemGroup> <!-- 打包自定义targets文件到buildTransitive目录 --> <ItemGroup> <None Include="Package.A.targets" Pack="true" PackagePath="buildTransitive" /> </ItemGroup> </Project>
2. 修正自定义.targets文件(命名为Package.A.targets)
调整文件匹配规则,确保复制时保留原目录结构,并选择更合适的执行时机:
<Project> <!-- 匹配buildTransitive/Special下的所有文件 --> <ItemGroup> <SpecialFiles Include="$(MSBuildThisFileDirectory)Special\**" /> </ItemGroup> <!-- 复制文件到输出目录,完整保留原目录结构 --> <Target Name="CopySpecialFiles" AfterTargets="CopyFilesToOutputDirectory"> <Copy SourceFiles="@(SpecialFiles)" DestinationFiles="$(OutDir)\%(SpecialFiles.RecursiveDir)%(SpecialFiles.FileName)%(SpecialFiles.Extension)" SkipUnchangedFiles="true" /> </Target> </Project>
3. 重新打包并测试
- 删除项目的
bin、obj目录,清理本地NuGet缓存。 - 执行打包命令:
dotnet pack,生成新的Package.A.nupkg。 - 在消费者项目中引用新包并构建,输出目录将出现完整的
Special文件夹及其所有子文件、子目录。
内容的提问来源于stack exchange,提问作者pfinferno
相关产品推荐
相关产品推荐

