C# 创建NuGet包方法 C#如何打包和发布自己的类库

来源:这里教程网 时间:2026-02-21 17:41:02 作者:

用 dotnet pack 打包类库最直接

只要项目是 SDK 风格(

.csproj
文件里有
<sdk>Microsoft.NET.Sdk</sdk>
),不用额外装工具,直接命令行运行:
dotnet pack --configuration Release
就会在
bin/Release
下生成
.nupkg
文件。注意别漏掉
--configuration Release
——Debug 模式打包可能含调试符号、版本号带
-dev
后缀,上传到 NuGet.org 会被拒。

常见错误:项目没设

<packageid></packageid>
<version></version>
,打包后文件名是
Unnamed.1.0.0.nupkg
。必须在
.csproj
里显式写:
<PropertyGroup>
  <PackageId>MyAwesomeLib</PackageId>
  <Version>1.0.0</Version>
  <Authors>YourName</Authors>
  <Description>A short description</Description>
</PropertyGroup>

nuget.exe push 发布到 nuget.org

发布前先去 nuget.org 创建 API Key(只显示一次,务必复制保存)。然后执行:

nuget.exe push MyAwesomeLib.1.0.0.nupkg -Source https://api.nuget.org/v3/index.json -ApiKey YOUR_API_KEY_HERE
如果提示
nuget.exe
找不到,就去 下载最新版 并加到 PATH,或者用完整路径调用。

容易踩的坑:

API Key 权限范围要选 “Push new packages”(不是 “All packages”) 包名已存在且你不是所有者?会报错
403 Forbidden
版本号重复?报错
409 Conflict
,得升版再推

用 Directory.Build.props 统一管理多项目元数据

如果你维护多个类库,每个都手写

PackageId
Description
容易不一致。可以在解决方案根目录建
Directory.Build.props
,内容如下:
<Project>
  <PropertyGroup>
    <PackageProjectUrl>https://github.com/you/repo</PackageProjectUrl>
    <RepositoryUrl>https://github.com/you/repo</RepositoryUrl>
    <PackageLicenseExpression>MIT</PackageLicenseExpression>
    <IncludeSymbols>false</IncludeSymbols>
  </PropertyGroup>
</Project>
所有子项目的
.csproj
就能自动继承这些设置,不用每处重复写。

注意:

IncludeSymbols
默认为
true
时会生成
.snupkg
,但 nuget.org 要求它和
.nupkg
版本严格一致;若不打算提供源码调试支持,显式关掉更省事。

本地测试包是否可用,别跳过这步

上传前,先在本地验证包结构和引用是否正常:

nuget.exe install MyAwesomeLib.1.0.0.nupkg -OutputDirectory ./test
解压看看
lib/
目录下有没有对应框架的 dll(比如
net6.0/
netstandard2.0/
新建一个测试项目,执行
dotnet add package MyAwesomeLib --source ./test
,看能否成功解析并编译通过
检查
.nuspec
内容(用
nuget.exe spec
生成模板对比):
<dependencies></dependencies>
是否漏了
<group targetframework="net6.0"></group>
这类声明
很多“上传成功但别人引用失败”的问题,其实是因为
TargetFrameworks
PackageReference
的兼容性没对齐,本地测一遍能避开 80% 的尴尬。

真正麻烦的是跨平台目标框架(比如同时支持

net6.0
netstandard2.0
)+ 带原生依赖的场景,这时候
lib/
下目录结构、
runtimes/
分组、
.targets
文件都要手动校验——别指望
dotnet pack
全替你兜底。

相关推荐