使用 .NET 开发CLI | coo

引言

经常需要创建新项目,然而项目结构,一些初始代码等往往是相同的,这个时候可以制作模板来解决,为了更方便创建模板项目,甚至可以控制远程同步创建GitHub仓库,自动配置CI/CD等,于是我选择开发一个CLI工具来加快日常开发效率,之前有使用过Node.js开发CLI(moq就是其作品),但效果不佳,总的说来其实还是对Node.js不熟悉,如果过多的花费时间在工具的开发上就得不偿失了,于是便有了使用熟悉的C#来开发CLI工具。注:本文只是记录如何使用C#开发一个简单的CLI工具。

前提

  • .NET 5.0 SDK 或者更高

创建Project

.NET CLI
1
dotnet new console -n coo -f net5.0

进入 coo

.NET CLI
1
cd coo

添加代码

Program.cs

Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using System;
using System.Reflection;

namespace coo
{
class Program
{
static void Main(string[] args)
{
if (args.Length == 0)
{
var versionString = Assembly.GetEntryAssembly()
.GetCustomAttribute<AssemblyInformationalVersionAttribute>()
.InformationalVersion
.ToString();

Console.WriteLine($"coo v{versionString}");
Console.WriteLine("-------------");
Console.WriteLine("\nUsage:");
Console.WriteLine(" coo <message>");
return;
}

ShowBot(string.Join(' ', args));
}

static void ShowBot(string message)
{
string bot = $"\n {message}";
bot += @"
__________________
\
\
....
....'
....
..........
.............'..'..
................'..'.....
.......'..........'..'..'....
........'..........'..'..'.....
.'....'..'..........'..'.......'.
.'..................'... ......
. ......'......... .....
. _ __ ......
.. # ## ......
.... . .......
...... ....... ............
................ ......................
........................'................
......................'..'...... .......
.........................'..'..... .......
........ ..'.............'..'.... ..........
..'..'... ...............'....... ..........
...'...... ...... .......... ...... .......
........... ....... ........ ......
....... '...'.'. '.'.'.' ....
....... .....'.. ..'.....
.. .......... ..'........
............ ..............
............. '..............
...........'.. .'.'............
............... .'.'.............
.............'.. ..'..'...........
............... .'..............
......... ..............
.....
";
Console.WriteLine(bot);
}

}
}

打包工具

在你打包和分发作为工具的应用之前,你需要修改项目文件。

  1. 打开 coo.csproj 文件,添加下方 XML节点到 <PropertyGroup> 节点内。
1
2
3
<PackAsTool>true</PackAsTool>
<ToolCommandName>coo</ToolCommandName>
<PackageOutputPath>./nupkg</PackageOutputPath>

补充:

<ToolCommandName>

可选,指明安装后,激活此工具的命令。

缺省:项目文件名去掉 .csproj,例如:coo.csproj,则缺省为:coo

<PackageOutputPath> :

可选,NuGet包位置,NuGet包被用于.NET CLI安装你的工具

执行 dotnet pack 后,生成 coo.1.0.0.nupkg 的位置

完整 coo.csproj 文件内容:

coo.csproj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>

<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>

<PackAsTool>true</PackAsTool>
<ToolCommandName>coo</ToolCommandName>
<PackageOutputPath>./nupkg</PackageOutputPath>

</PropertyGroup>

</Project>
  1. 创建 NuGet 包
.NET CLI
1
dotnet pack

全局使用工具

1. 安装工具

.NET CLI
1
dotnet tool install --global --add-source ./nupkg coo

补充:

--global :

告诉 .NET CLI 安装工具的默认位置将被自动添加到 PATH 环境变量,这样既可全局使用。

--add-source :

告诉 .NET CLI 临时使用 ./nupkg 目录 作为一个额外的NuGet包源订阅地址,

你应该给你的包一个独一无二的名字确保它只会在 ./nupkg 目录找到,而不是在 Nuget.org 站点。

2. 调用工具

1
coo "测试"

补充:

如果命令失败,你需要打开一个新的终端以便刷新 PATH

Q: 不知道为什么 执行 dotnet tool list ,没有工具显示,EF Tool 都没有

A: TODO: dotnet tool list 无工具显示

3. 卸载工具

.NET CLI
1
dotnet tool uninstall -g coo

注意:

因为是全局安装的工具,所有卸载时也需要 -g 全局卸载。

本地使用工具

参考

感谢帮助!