用 dotnet pack 生成 .nupkg 文件的核心是基于 sdk 风格项目直接打包,需显式指定 --configuration release 和输出路径;元数据应写在 .csproj 中,避免手动维护 .nuspec;多框架支持通过 声明;推送时须用 nuget.org 的 scoped token 并指定 v3 源;发布后需等待索引完成并清除本地缓存方可正常使用。

怎么用 dotnet pack 生成 .nupkg 文件
核心是把项目编译输出和 .nuspec(或项目文件内声明)打包成标准 NuGet 包。直接运行 dotnet pack 就行,但默认行为容易踩坑。
-
dotnet pack默认只打包Release配置,如果项目没切到 Release,会生成空包或报错 - 推荐显式指定:
dotnet pack --configuration Release --output ./nupkgs - 若项目是 SDK 风格(
<project sdk="Microsoft.NET.Sdk"></project>),无需单独写.nuspec,元数据直接写在.csproj里更可靠,比如:<packageid>MyLib</packageid>、<version>1.0.0</version>、@#@#@#@#@#@#@#@#@#@0 创建一个 scoped token(建议 scope 限定为 <code>Push+ 具体Package ID,别用*) - 用
dotnet nuget push时必须加--api-key和--source:dotnet nuget push ./nupkgs/MyLib.1.0.0.nupkg --api-key xxxxxx --source https://api.nuget.org/v3/index.json - 别用
nuget.exe push—— 它默认走 v2 源,而 nuget.org 的 v2 已停用,会返回 403 或超时 - 如果本地有
NUGET_API_KEY环境变量,dotnet nuget push不会自动读取,必须显式传参
如何让包支持多 Target Framework(如 net6.0 + netstandard2.0)
不是靠多个 .csproj,而是在单个项目里声明多个目标框架,否则用户安装时可能找不到匹配项。
- 在
.csproj中写:<targetframeworks>net6.0;netstandard2.0</targetframeworks>(注意是复数TargetFrameworks) - 条件编译代码用
#if NET6_0或#if NETSTANDARD2_0,别用硬编码路径或运行时判断 -
dotnet pack会自动为每个 TF 生成对应程序集,并放进lib/<tf>/</tf>目录下;不手动干预.nuspec的<files></files>段 - 如果只写
<targetframework></targetframework>(单数),即使加了<packagetargetfallback></packagetargetfallback>,也无法真正生成多框架包,下游项目引用时会 fallback 失败或警告
发布后别人装不上,或者 IDE 不提示更新怎么办
常见原因是包没进索引队列,或本地缓存太旧,不是代码或版本问题。
- nuget.org 接收包后需要几分钟到十几分钟才完成索引(尤其新包首次发布),期间
dotnet add package可能提示“找不到”,等一等再试 - 本地执行
dotnet nuget locals all --clear清掉缓存,再重试安装 - 确认包名大小写完全一致 —— NuGet 包名区分大小写,
MyLib和mylib是两个不同包 - 如果用了预发布版本(如
1.0.0-alpha),dotnet add package默认不拉预发布包,得加--prerelease参数
最常被忽略的是:包上传成功不等于立刻可用,索引延迟和客户端缓存是真实存在的物理时间。别在 push 后立刻切到另一台机器验证,先等三分钟,再清缓存,再试。










