G
N
I
D
A
O
L

【NuGet攻略】C#开发者必备技能:构建发布开发工具包

来源 https://mp.weixin.qq.com/s/YqKTdyLXuODBLxnhar52Xg 

前言

在 C# 开发领域里,构建代码库,分享与使用可复用代码的机制是十分必要的,它可以提高开发效率。通常,我们把可复用代码打包后的文件称为包(Package)

在 .NET 中,通过使用 NuGet 平台实现包的管理。它提供了一系列客户端用于生成、上传、使用和存储所有包的中心库。本文将介绍如何将C#类库打包并发布到 NuGet

准备工作

1、安装工具

需要将C#的类库打包到NuGet上,安装 NuGet 管理工具是必不可少的,它就像是一个智能的资源管理器,能帮我们轻松管理 NuGet 包。(Visual Studio 较新版本,一般会自带 NuGet Package Manager。

// 官网下载地址https://www.nuget.org/downloads

2、获取 API KEY

要将生成的 NuGet 包发布到 NuGet 服务器,我们还需要获取一个 API KEY。它用于验证我们的身份,确保只有我们才能将包发布到指定的账户下。

// NuGet 官网地址https://www.nuget.org/
打开浏览器,访问 NuGet 官网,点击右上角的登录按钮,如果还没有账号,点击注册,按照提示填写相关信息进行注册。登录账号后,点击右上角的账户,选择API keys 

 


在这个页面,点击 Create ,在 Select Scopes 下拉框中选择 Push(表示这个 API Key 用于推送包)。在 Glob pattern 输入框中填入*(表示这个 API Key 可以用于推送所有的包)。最后点击 Create  按钮,就会生成一个 API Key。

注意:API Key 非常重要,一定要妥善保存,不要泄露给他人。

3、创建类库

现在,工具都准备好了,我们来创建一个 C# 类库项目。这里以一个简单的数字转大写人民币类库为例。当然也可以是其他,如字符串处理、数据验证等。

使用 Visual Studio 创建一个 .NET 类库项目,命名为 Fountain.Utility.Extension(自定义命名),然后在项目下创建数字转大写人民币转换的类,命名为 Numbers (自定义命名)。

using System.Text;namespace Fountain.Utility.Extension{    public class Numbers    {        private static readonly string[] ChineseNumbers = { "零""壹""贰""叁""肆""伍""陆""柒""捌""玖" };        private static readonly string[] ChineseUnits = { """拾""佰""仟" };        private static readonly string[] ChineseSectionUnits = { """万""亿""万亿" };        /// <summary>        /// 转换        /// </summary>        /// <param name="amount">金额</param>        /// <returns></returns>        public static string Convert(decimal amount)        {            if (amount == 0)            {                return "零元整";            }            long integerPart = (long)Math.Truncate(amount);            ///            int decimalPart = (int)Math.Round((amount - integerPart) * 100MidpointRounding.AwayFromZero);            // 存处理结果            StringBuilder result = new StringBuilder();            // 处理整数部分            if (integerPart > 0)            {                IntegerPart(integerPart, result);                result.Append("元");            }            // 处理小数部分            if (decimalPart > 0)            {                DecimalPart(decimalPart, result);            }            else            {                if (integerPart > 0)                {                    result.Append("整");                }            }            return result.ToString();        }        /// <summary>        /// 整书部份        /// </summary>        /// <param name="number"></param>        /// <param name="stringBuilder"></param>        private static void IntegerPart(long number, StringBuilder stringBuilder)        {            int sectionIndex = 0;            bool needZero = false;            while (number > 0)            {                int section = (int)(number % 10000);                if (needZero)                {                    stringBuilder.Insert(0, "零");                }                string sectionStr = ConvertSection(section);                if (section != 0)                {                    stringBuilder.Insert(0, sectionStr + ChineseSectionUnits[sectionIndex]);                }                needZero = (section < 1000 && section > 0);                number /= 10000;                sectionIndex++;            }        }        /// <summary>        ///         /// </summary>        /// <param name="section"></param>        /// <returns></returns>        private static string ConvertSection(int section)        {            StringBuilder stringBuilder = new StringBuilder();            int unitIndex = 0;            bool zero = false;            for (int i = 0; i < 4; i++)            {                int num = section % 10;                if (num == 0)                {                    if (!zero && section / 10 > 0)                    {                        zero = true;                    }                }                else                {                    if (zero)                    {                        stringBuilder.Insert(0"零");                        zero = false;                    }                    stringBuilder.Insert(0ChineseNumbers[num] + ChineseUnits[unitIndex]);                }                section /= 10;                unitIndex++;            }            return stringBuilder.ToString();        }        /// <summary>        /// 小数部份        /// </summary>        /// <param name="decimalPart"></param>        /// <param name="stringBuilder"></param>        private static void DecimalPart(int decimalPart, StringBuilder stringBuilder)        {            int jiao = decimalPart / 10;            int fen = decimalPart % 10;            if (jiao > 0)            {                stringBuilder.Append(ChineseNumbers[jiao] + "角");            }            if (fen > 0)            {                stringBuilder.Append(ChineseNumbers[fen] + "分");            }            if (jiao == 0 && fen > 0)            {                stringBuilder.Insert(stringBuilder.Length - 2"零");            }        }    }}

NuGet 发布

1、配置项目属性

在解决方案资源管理器中,右键点击我们创建的项目,选择属性。在弹出的属性窗口中,选择包(或打包) 选项卡。

在 打包 选项卡中,有几个关键信息需要我们配置:

  • 包 ID:是包的唯一标识符,它在 NuGet 库中必须是独一无二的。可以根据项目的实际情况来命名。

  • 版本号:版本号对于类库的管理和更新非常重要。应遵循语义化版本号的规范,格式为 【主版本号.次版本号.修订号】。

  • 作者:填写类库的开发者或团队名称,这样使用者就能知道这个类库是谁开发的。

  • 描述:用简洁明了的语言描述类库的功能和用途,让使用者在看到包的时候就能快速了解它的作用。

 


2、编译打包

  • 使用 Visual Studio 自带的打包功能:在解决方案资源管理器中,右键点击项目,选择 打包。Visual Studio 会自动执行打包操作,并在输出窗口中显示打包的进度和结果。打包完成后,我们可以在项目的bin\Release目录下找到生成的.nupkg 文件。

  • 使用命令行工具: 使用 nuget pack 、 dotnet pack  和 msbuild -t:pack -p:Configuration=Release

nuget pack: 旧的打包行为,对于 SDK 样式的项目,已不再被支持。

dotnet pack:NET Core 或 .NET 5.0 及更高版本,推荐使用。

msbuild -t:pack 对倾向于使用 MSBuild 来打包的。

通过 Developer Command Prompt for vs 2022 命令行或 CMD 命令行,执行 dotnet pack 项目名

3、推送包到 NuGet

  • 设置API Key: 通过命令 nuget setapikey -----------  使用上面获取的API Keys

 

  • 推送包: 通过命令 nuget.exe push 包名.nupkg(完整路径) -Source https://www.nuget.org  把包推送NuGet服务器。

使用NuGet包

我们可以使用 NuGet 包管理器或 CLI 搜索包。

 

using Fountain.Utility.Extension;namespace Fountain.Utility.Test{    internal class Program    {        static void Main(string[] args)        {            Console.WriteLine(Numbers.Convert(135.30M));            Console.Read();        }    }}

小结

在 C# 开发的领域中,将类库打包到 NuGet,无疑在我们的编程过程中增添了强大助力。我们通过一步步的操作,将自己编写的类库转化为的 NuGet 包。希望本文对您有所收获,如有不到之处,请多多包涵。
posted @ 2025-02-25 05:35  firespeed  阅读(411)  评论(0)    收藏  举报