开发现代化的.NetCore控制台程序:(2)创建一个C#项目模板

前言

上一篇文章(开发一个现代化的.NetCore控制台程序,包含依赖注入/配置/日志等要素)介绍了开发现代化的.NetCore控制台程序的细节,但这还不够,我又创建了一个脚手架模板,并命名为 FluentConsole.Templates ,可以方便的创建「现代化控制台应用」。

源码地址: https://github.com/Deali-Axy/fluent-dotnet-console

Nuget包地址: https://www.nuget.org/packages/FluentConsole.Templates/

模板功能

  • 🚀 提供快速开发模板,一键生成控制台应用的项目骨架
  • 🐴 提供一个「现代化控制台应用项目结构的最佳实践」的参考方案
  • 💉 依赖注入 - 基于 Microsoft.Extensions.DependencyInjection 的依赖注入支持
  • 📄 日志 - 基于 Microsoft.Extensions.Logging 日志框架,搭配 Serilog 实现日志文件输出
  • 🔧 配置 - 基于 Microsoft.Extensions.Configuration 配置框架,搭配 dotenv.net 等组件扩展功能

快速开始

安装模板

bash 复制代码
dotnet new install FluentConsole.Templates

使用模板创建项目

bash 复制代码
dotnet new flu-cli -n MyProject

项目目录结构

使用模板创建的项目目录结构是这样,代码统一放在 src 目录下。

sql 复制代码
MyProject
 ├─ src
 │  ├─ Utilities
 │  │  └─ ConsoleTool.cs
 │  ├─ Services
 │  │  ├─ MainService.cs
 │  │  └─ IService.cs
 │  ├─ MISC
 │  │  └─ SourceGenerationContext.cs
 │  ├─ Entities
 │  │  ├─ OutputResult.cs
 │  │  └─ AppSettings.cs
 │  └─ Program.cs
 ├─ MyProject.csproj
 ├─ Dockerfile
 └─ appsettings.json

这是 src 里每个目录的介绍:

  • Utilities - 存放通用工具类
  • Services - 业务逻辑代码
  • MISC - 杂项
  • Entities - 实体类,强类型配置、输出结果对象

因此,创建项目之后,直接在 Services/MainService.cs 文件里写业务逻辑就好了。

如何创建项目模板?

跟着微软官方的教程来,非常容易,主要是一些目录结构方面的细节需要处理一下。

以本项目的源码为例,我们需要一个创建模板的工作目录,这个目录在本项目中是 src/Templates

tsx 复制代码
Templates
 ├─ content
 │  └─ FluentConsole.Template
 │     ├─ FluentConsole.Template
 │     │  ├─ src
 │     │  ├─ FluentConsole.Template.csproj
 │     │  ├─ Dockerfile
 │     │  ├─ appsettings.json
 │     │  └─ .env
 │     └─ .template.config
 │        └─ template.json
 └─ FluentConsole.Templates.csproj

然后把所有模板放在 content 目录中,可以理解为 content 目录下面每个目录都是一个模板,当然本项目只创建了一个模板,也许以后会添加更多的模板。

每个模板下面最重要的就是 .template.config ,有了这个目录,dotnet 才会识别到这是个模板

当然还得写个模板配置 template.json

json 复制代码
{
  "$schema": "http://json.schemastore.org/template",
  "author": "DealiAxy",
  "classifications": [
    "Common",
    "Console"
  ],
  "identity": "FluentConsole.Template",
  "name": "FluentConsole.Template",
  "description": "提供「现代化的控制台应用的开发体验」脚手架,能像 Web 应用那样很优雅地整合各种组件,包括依赖注入、配置、日志等功能。",
  "shortName": "flu-cli",
  "sourceName": "FluentConsole.Template",
  "tags": {
    "language": "C#",
    "type": "project"
  }
}

注意其中的 sourceName 字段,这是模板创建时会被替换的内容。

比如我们使用了以下命令,从模板创建一个项目,通过 -n 指定了项目名称为 MyProject

bash 复制代码
dotnet new flu-cli -n MyProject

那么 dotnet 会自动把 sourceName 设置的这个名字替换为用户指定的项目名称 MyProject

OK,暂时就是这些了,创建模板就这么简单。

安装模板

可以直接从源码安装模板

依然是这个项目代码,切换到模板代码所在的目录下面,即可安装模板

bash 复制代码
cd src/Templates/content/FluentConsole.Template
dotnet new install ./

安装后可以看到安装成功的提示

bash 复制代码
成功: FluentConsole.Templates::1.1.0 已安装以下模板:
----------------------  -------  ----  --------------
FluentConsole.Template  flu-cli  [C#]  Common/Console

创建 nuget 包

src/Templates 下创建 FluentConsole.Templates.csproj 文件

关键代码如下

xml 复制代码
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <PackageId>FluentConsole.Templates</PackageId>
    <PackageVersion>1.1</PackageVersion>
    <Title>FluentDotnetConsole Templates</Title>
    <Authors>DealiAxy</Authors>
    <Company>CodeLab</Company>
    <Description>提供「现代化的控制台应用的开发体验」脚手架,能像 Web 应用那样很优雅地整合各种组件,包括依赖注入、配置、日志等功能。</Description>
    <PackageTags>dotnet-new;templates;console;cli</PackageTags>
    <PackageProjectUrl>https://github.com/Deali-Axy/fluent-dotnet-console</PackageProjectUrl>

    <PackageType>Template</PackageType>
    <TargetFramework>netstandard2.0</TargetFramework>
    <IncludeContentInPack>true</IncludeContentInPack>
    <IncludeBuildOutput>false</IncludeBuildOutput>
    <ContentTargetFolders>content</ContentTargetFolders>
    <NoWarn>$(NoWarn);NU5128</NoWarn>
    <NoDefaultExcludes>true</NoDefaultExcludes>
    <PackageReadmeFile>README.md</PackageReadmeFile>
  </PropertyGroup>

  <ItemGroup>
    <Content Include="content\**\*" Exclude="content\**\bin\**;content\**\obj\**"/>
    <Compile Remove="**\*"/>
  </ItemGroup>
</Project>

然后执行 dotnet pack 即可创建 nuget 包

然后可以上传到 nuget 平台。

使用 GitHub 发布 nuget 包

GitHub 提供了 Packages 管理的功能,可以直接从 GitHub 项目直接创建 nuget 包,并发布到 nuget 平台。

PS:我研究一下,下一篇文章再继续介绍。

参考资料

相关推荐
yngsqq4 分钟前
031集——文本文件按空格分行——C#学习笔记
笔记·学习·c#
新手unity自用笔记15 小时前
项目-坦克大战学习-子弹的移动与销毁
笔记·学习·c#
qinzechen16 小时前
分享几个做题网站------学习网------工具网;
java·c语言·c++·python·c#
yufei-coder19 小时前
C# Windows 窗体开发基础
vscode·microsoft·c#·visual studio
dangoxiba20 小时前
[Unity Demo]从零开始制作空洞骑士Hollow Knight第十三集:制作小骑士的接触地刺复活机制以及完善地图的可交互对象
游戏·unity·visualstudio·c#·游戏引擎
AitTech20 小时前
深入理解C#中的TimeSpan结构体:创建、访问、计算与格式化
开发语言·数据库·c#
hiyo5851 天前
C#中虚函数和抽象函数的概念
开发语言·c#
开心工作室_kaic1 天前
基于微信小程序的校园失物招领系统的设计与实现(论文+源码)_kaic
c语言·javascript·数据库·vue.js·c#·旅游·actionscript
时光追逐者1 天前
WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!
前端·microsoft·开源·c#·.net·layui·.netcore
friklogff1 天前
【C#生态园】打造现代化跨平台应用:深度解析.NET桌面应用工具
开发语言·c#·.net