生成NuGet包(.nupkg)时报错提示待打包dll文件在磁盘不存在
问题根因
报错本质是NuGet打包时查找dll的路径和项目实际生成dll的路径不匹配:
- 你在csproj中配置的
OutDir引用了未正确赋值的$(DIstributionDir)变量(变量名存在大小写/拼写问题,未被正确定义),生成操作时SDK会自动回退到默认输出路径所以能正常编译,但nuget.exe pack不会做这个回退逻辑,会硬编码按照默认路径规则拼接dll查找路径,最终找不到文件。 - 你配置中的
<ProductReferenceAssemblyInOutDir>存在拼写错误,正确属性名为<ProduceReferenceAssemblyInOutDir>,该配置错误会干扰程序集输出逻辑。
解决步骤
- 修正csproj配置错误
首先修正属性拼写问题,如果没有特殊自定义输出目录的需求,直接删除自定义的OutDir配置,使用SDK默认输出规则即可,修正后的基础配置如下:
如果你确实需要自定义输出目录,显式给<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <ProduceReferenceAssemblyInOutDir>true</ProduceReferenceAssemblyInOutDir> </PropertyGroup> </Project>OutDir赋值为确定的路径,不要引用未定义的变量。 - 替换打包命令
不建议直接使用独立的nuget.exe pack打包SDK风格的项目,改用.NET SDK内置的打包命令,在项目根目录执行:
该命令会自动读取csproj中的所有输出路径配置,从实际dll生成位置读取文件打包,不会出现路径不匹配问题。dotnet pack -c Release - 兼容nuget.exe的处理方式
如果必须使用v6.2.0版本的nuget.exe打包,执行打包命令时需要显式传入OutDir参数,指定dll实际所在的目录:
注意路径要替换成你实际编译后dll所在的完整路径。nuget pack MyApi.csproj -Properties OutDir=./bin/Release/netstandard2.0/
排查验证技巧:先执行清理命令
dotnet clean,再执行dotnet build,确认编译完成后dll所在的实际磁盘路径,再执行打包操作,避免obj目录下的旧缓存文件干扰路径判断。
内容的提问来源于stack exchange,提问作者user19011893
相关产品推荐
相关产品推荐

