在C#开发中,将通用功能封装成NuGet包可以极大提升代码的复用性,也能方便团队协作时共享公共组件。下面我们将通过一个实际的类库项目,完整演示从创建项目到发布NuGet包的全过程。

一、准备类库项目
首先我们需要创建一个C#类库项目,作为要打包的NuGet包内容。打开Visual Studio,选择创建新项目,搜索类库(.NET_Standard)或者类库(.NET),根据目标使用场景选择对应的框架版本,这里以.NET Standard 2.0为例,创建名为MyUtils的类库项目。
在项目中添加一个简单的工具类,用于后续验证包的功能:
using System;
namespace MyUtils
{
public class StringHelper
{
/// <summary>
/// 判断字符串是否为空或空白
/// </summary>
/// <param name="input">输入字符串</param>
/// <returns>是否为空或空白</returns>
public static bool IsNullOrWhiteSpace(string input)
{
return string.IsNullOrWhiteSpace(input);
}
}
}
二、配置NuGet包信息
NuGet包需要包含基本的元数据信息,比如包名、版本、作者、描述等,这些信息可以在项目文件(.csproj)中配置。右键点击项目,选择编辑项目文件,添加如下配置:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<!-- 包的基本信息 -->
<PackageId>MyUtils.Core</PackageId>
<Version>1.0.0</Version>
<Authors>TestAuthor</Authors>
<Company>TestCompany</Company>
<Description>通用字符串处理工具类库</Description>
<PackageTags>C#,工具,字符串处理</PackageTags>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
</PropertyGroup>
</Project>
上述配置中,PackageId是NuGet包的唯一标识,后续发布到仓库后其他项目通过这个名称引用;Version是包的版本号,每次更新需要递增;GeneratePackageOnBuild设置为false表示不自动打包,我们后续手动执行打包操作。
三、本地打包生成NuGet包
配置完成后,我们可以通过dotnet命令行工具进行打包。打开终端,切换到项目所在目录,执行以下命令:
dotnet pack -c Release
命令执行成功后,会在项目的bin/Release目录下生成.nupkg格式的文件,这就是我们创建的NuGet包。如果要验证包的内容是否正确,可以使用NuGet Package Explorer工具打开该文件查看内部的元数据和依赖信息。
四、发布NuGet包到仓库
生成包之后,我们可以将其发布到NuGet官方仓库或者私有的NuGet仓库。这里以发布到NuGet官方仓库为例,首先需要到NuGet官网获取自己的API Key,然后在终端执行发布命令:
dotnet nuget push bin/Release/MyUtils.Core.1.0.0.nupkg --api-key 你的API_Key --source https://api.nuget.org/v3/index.json
如果是发布到私有仓库,只需要将--source后面的地址替换为私有仓库的地址即可。发布成功后,其他项目就可以通过NuGet包管理器搜索MyUtils.Core来安装使用这个包了。
五、注意事项
- 包版本号遵循语义化版本规范,格式为
主版本.次版本.修订号,重大变更升级主版本,新增功能升级次版本,bug修复升级修订号。 - 如果类库依赖其他NuGet包,需要在项目文件中通过
PackageReference添加依赖,打包时会自动将依赖信息写入包元数据。 - 发布到官方仓库的包需要遵守NuGet的相关规范,避免发布包含恶意代码或者侵权内容的包。
引用测试示例
其他项目安装该包后,可以通过以下代码使用我们封装的功能:
using System;
using MyUtils;
class Program
{
static void Main()
{
string testStr = " ";
bool result = StringHelper.IsNullOrWhiteSpace(testStr);
Console.WriteLine($"字符串是否为空或空白:{result}");
}
}