导读:本期聚焦于孙志远创作的《C#如何创建并发布自己的NuGet包?新手入门教程详解》,敬请观看详情。想在C#项目里复用自己写的工具类,或者把封装好的功能分享给团队和社区?把类库打包成NuGet包是最标准的做法。本文面向新手,完整讲解NuGet包的创建与发布流程:从类库项目搭建、csproj文件配置包信息、版本号规则、生成nupkg文件,到本地测试安装、发布到nuget.org或私有源,以及更新版本时容易踩的坑。全程使用Visual Studio和dotnet命令行两种方式演示,跟着步骤操作即可把自己的第一个包发布上线。

写C#代码久了,总会积累一些好用的工具类:字符串处理、加密解密、日志封装等等。每次新开项目都复制一遍源码,不仅麻烦,而且一旦修了Bug还得挨个项目去改。最优雅的解决方案就是把这些代码封装成类库,打包成NuGet包,之后任何项目一条命令就能引用,升级也只需要更新版本号。本文将从零开始,带你完成第一个NuGet包的创建、本地测试和正式发布。

C#如何创建并发布自己的NuGet包?新手入门教程详解

一、创建类库项目并配置包信息

首先打开Visual Studio,新建项目时选择类库模板,框架建议选择.NET 6或.NET 8这类长期支持版本。也可以直接用命令行创建:

dotnet new classlib -n MyUtils -o MyUtils
cd MyUtils

项目创建好后,关键的一步是配置包的元数据。右键项目文件选择编辑,或者直接打开MyUtils.csproj,填入以下内容:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <PackageId>MyUtils</PackageId>
    <Version>1.0.0</Version>
    <Authors>你的名字</Authors>
    <Company>你的公司</Company>
    <Description>一套常用的C#工具类库,包含字符串处理和加密功能</Description>
    <PackageLicenseExpression>MIT</PackageLicenseExpression>
    <RepositoryUrl>https://github.com/yourname/MyUtils</RepositoryUrl>
    <PackageIcon>icon.png</PackageIcon>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
  </PropertyGroup>

  <ItemGroup>
    <None Include="icon.png" Pack="true" PackagePath="" />
  </ItemGroup>
</Project>

这些属性会直接展示在NuGet管理器和nuget.org的包详情页上,其中Description写清楚包能做什么非常关键,直接影响别人是否愿意安装。如果打算发布到公共源,建议准备一张128x128的图标图片放在项目根目录。另外,版本号建议遵循SemVer语义化版本规则:重大不兼容修改升主版本,新增功能升次版本,修Bug升修订号,例如1.2.3

二、打包并本地测试

配置完成后执行打包命令,生成的.nupkg文件就是最终的NuGet包,位于项目的bin\Debug目录下:

dotnet pack --configuration Release

发布前务必先在本地测试一遍,否则包里缺文件或者API设计不合理,发布出去再撤回就很尴尬。本地测试有两种常用方式。第一种是搭建本地文件夹源:新建一个空文件夹比如C:\LocalNuGet,在Visual Studio的NuGet包管理器设置中把这个文件夹添加为程序包源,然后把生成的nupkg文件复制进去,其他项目就能搜索安装了。

第二种方式更直接,在测试项目里通过路径引用:

<ItemGroup>
  <PackageReference Include="MyUtils" Version="1.0.0" />
</ItemGroup>

测试时重点确认三件事:引用后能否正常编译、公开的类和方法是否都能访问到、依赖的其他第三方包有没有被正确带进依赖链。如果类库里某些方法不想暴露出去,记得用internal修饰,或者结合InternalsVisibleTo控制可见范围。

三、发布到nuget.org与日常更新

公共发布需要先到nuget.org注册账号并获取API Key。登录后进入账户设置里的API Keys页面,点击创建,作用域选择Push新包和更新包,过期时间按需设置,生成后立即复制保存,这个Key只显示一次。

拿到Key之后执行推送命令:

dotnet nuget push bin\Release\MyUtils.1.0.0.nupkg ^
  --api-key 你的APIKey ^
  --source https://api.nuget.org/v3/index.json

推送成功后,包会先进入处理状态,几分钟内就能在nuget.org搜索到。注意nuget.org有一个重要规则:已发布的版本号永久不可覆盖,即使马上删除包,该版本号也不能再次使用。所以每次更新代码必须修改csproj里的Version再重新打包推送。日常更新推荐一条命令完成打包加推送:

dotnet pack --configuration Release && dotnet nuget push bin\Release\MyUtils.1.0.1.nupkg --api-key 你的APIKey --source https://api.nuget.org/v3/index.json

如果是企业内部使用,不想把代码公开到公网,可以搭建私有源。最简单的方案是搭建BaGet或ProGet服务,或者直接用Azure Artifacts、团队局域网共享文件夹作为源。私有源的推送命令完全一样,只需要把--source参数换成私有源地址即可。

四、常见问题与避坑建议

新手第一次发布最容易遇到几个问题。第一,包推送时报409冲突,说明版本号已存在,改高版本号重新打包即可。第二,目标框架选择问题:如果包只在.NET 8项目里用,TargetFrameworknet8.0没问题,但想兼容.NET Framework的老项目,就需要改成多目标并使用netstandard2.0

<TargetFrameworks>netstandard2.0;net8.0</TargetFrameworks>

第三,符号文件的问题。默认打包不会包含PDB调试符号,使用方调试时看不到源码。可以在csproj中加上<IncludeSymbols>true</IncludeSymbols><SymbolPackageFormat>snupkg</SymbolPackageFormat>,打包时会额外生成一个snupkg文件,推送时一并上传即可。

最后给一个实用建议:发布第一个包之前,先用dotnet nuget locals http-cache --clear清理本地缓存,避免测试时一直引用到旧版本造成误判。另外记得把源码推送到GitHub并在csproj里配置RepositoryUrl,这样nuget.org页面会自动关联仓库链接,可信度也会更高。掌握这套流程后,无论是个人工具库还是公司基础组件,都可以标准化地分发和升级了。

NuGet包发布C#类库Visual Studio修改时间:2026-09-07 09:14:39

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260907/52113.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。