37. 编写包管理工具
37.1 关于包管理工具
使用过 NodeJs 的朋友一定对 npm 命令不会陌生,可以通过 npm 安装项目需要的包或环境需要的工具,在 .NET Core 2.1+ 之后,微软也推出了新的特性,Global/Local Tools,该特性功能也正是受到 npm 启发下诞生的。
不同的是,npm 中的包采用的是 JavaScript 编写并发布到 https://www.npmjs.com/ 平台,而 dotnet tools 采用 C# 编写并发布到 https://www.nuget.org/ 平台供安装使用。
37.1.1 dotnet tools 包管理好处
- 跨平台,支持
Linux/Mac/Windows平台供安装使用 - 完整的
C#生态支持 - 为所欲为~~~(拥有操作系统的权限)
37.2 了解包命令语法
通常包命令语法都遵循以下规则:
<-|--|/>argument-name<=|:| >["|']value['|"] [--] [operand] ... [operand]
在这里,Furion 将简单介绍命令常用的知识:
工具符:通常指的是你工具的唯一名称,也就是关键字,而且总是在最开头编写,如:dotnet,npm,node短参数:短参数指的是单个字符的字符串,我们通常使用-一个横杆指定参数及值,如:-v或-v 0.0.1长参数:长参数指的是一个或多个单词连接的字符串,该参数通常和短参数同时存在,通常使用--指定参数及值,如:--version或--version 0.0.1操作符:字符串中与参数值格式不匹配的任何文本都被视为操作数,任何出现在双连字符--之后且未包含在单引号或双引号中且两侧有空格的文本都被视为操作数,无论它是否与参数值格式匹配,通常用于归类/分类作用。
37.2.1 短参数例子
-a foo
| 短参数 | 参数值 |
|---|---|
| a | foo |
-ab
| 短参数 | 参数值 |
|---|---|
| a | |
| b |
-abc bar
| 短参数 | 参数值 |
|---|---|
| a | |
| b | |
| c | bar |
37.2.2 长参数例子
--foo bar
| 长参数 | 参数值 |
|---|---|
| foo | bar |
--foo --bar
| 长参数 | 参数值 |
|---|---|
| foo | |
| bar |
--foo bar --hello world
| 长参数 | 参数值 |
|---|---|
| foo | bar |
| hello | world |
37.2.3 混合参数例子
-abc foo --hello world /new="slashes are ok too"
| 短/长参数 | 参数值 |
|---|---|
| a | |
| b | |
| c | foo |
| hello | world |
| new | slashes are ok too |
37.2.4 多个值参数
--list 1 --list 2 --list 3
| 长参数 | 参数值 |
|---|---|
| list | 1,2,3 |
37.2.5 操作符
-a foo bar "hello world" -b -- -explicit operand
| 短参数 | 参数值 |
|---|---|
| a | foo |
| b |
| 操作符 |
|---|
| bar |
| "hello world" |
| -explicit |
| operand |
了解更多关于包命令语法的官方知识:https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
37.3 编写第一个包
dotnet tools 工具实际上是一个 控制台 应用程序,不同的是 .csproj 项目文件需要添加特定配置。下面将给大家编写一个 HelloTools 包管理工具。

