dotnet pack 创建 nuget 包需项目为 sdk 风格并配置 packageid、version、targetframework 等元数据,必须用 release 模式打包,本地验证结构后再推送至源。

dotnet pack 是最直接的创建方式,但前提是项目必须是 SDK 风格(确认项目是 SDK 风格并配置必要元数据
打开 .csproj 文件,第一行必须是类似 <project sdk="Microsoft.NET.Sdk"></project> 的声明。老式项目(如含 ToolsVersion 或无 Sdk 属性)不支持 dotnet pack,强行运行也不会报错,但输出为空或仅含 Unnamed.1.0.0.nupkg。
必须显式设置以下属性,否则包名、版本、作者等信息缺失:
-
<packageid>MyLib</packageid>—— 包唯一标识,不能含空格或特殊字符 -
<version>1.0.0</version>—— 语义化版本;未设则 fallback 到1.0.0,但建议写死 -
<targetframework>net6.0</targetframework>或<targetframeworks>net6.0;net8.0</targetframeworks>—— 缺失会触发错误NU5026: The 'targetFramework' parameter was not specified -
<generatedocumentationfile>true</generatedocumentationfile>—— 否则生成的包不含 XML 文档文件
用 dotnet pack 打包时必须加 --configuration Release
Debug 模式打包会把调试符号打进包里,且版本号可能带 -dev 后缀,导致上传到 nuget.org 被拒(400 Bad Request)或私有源校验失败。
推荐命令:
dotnet pack --configuration Release --output ./nupkgs
这样能避免输出混在 bin/Release/ 下,也方便后续推送。若需多目标框架支持,加 --runtime win-x64 等参数前需确认项目已启用 <publishtrimmed>true</publishtrimmed> 或适配本机依赖。
本地验证包结构再发布
别跳过这步。直接推送失败再排查,远不如本地快速验证:
- 新建空
Console App项目 - 建文件夹(如
C:\local-nuget),把生成的.nupkg放进去 - VS 中:工具 → 选项 → NuGet 包管理器 → 包源 → 添加新源,路径填
C:\local-nuget,并勾选启用 - 在测试项目中安装该包,调用公开 API,确认无
CS0234或运行时FileNotFoundException
常见失败原因:<files></files> 节漏了 .dll(SDK 项目自动处理,但手动改过 <packastool></packastool> 或 <includesymbols></includesymbols> 可能干扰)、XML 文档未开启、contentFiles 未标记 buildAction=EmbeddedResource。
推送到 nuget.org 或私有源前检查三件事
推送失败 90% 不是网络问题,而是包本身不合规:
- 包名是否已存在且你不是所有者?报错
403 Forbidden - 版本号是否重复?报错
409 Conflict,必须升版再推 -
-SourceURL 是否完整正确?nuget.org必须用https://api.nuget.org/v3/index.json;BaGet 私有源是http://localhost:5000/v3/index.json(结尾必须是/v3/index.json)
命令示例:
dotnet nuget push ./nupkgs/MyLib.1.0.0.nupkg -s https://api.nuget.org/v3/index.json -k YOUR_API_KEY_HERE
API Key 权限务必选 “Push new packages”,且只对特定 PackageId 开放(如 MyLib.*),避免泄露后被滥用。
Directory.Build.props 和中央包管理虽不参与打包,但一旦启用,它会影响所有子项目的 PackageReference 版本解析逻辑;如果某个类库同时被当作依赖和被发布,却忘了在中央清单里声明其版本,dotnet pack 仍能成功,但下游引用方可能因版本不一致而编译失败。










