2021年4月22日星期四

Nuget-自定义模板的创建与使用

参考官方文档:

https://docs.microsoft.com/zh-cn/dotnet/core/tools/custom-templates

https://devblogs.microsoft.com/dotnet/how-to-create-your-own-templates-for-dotnet-new/

为什么要自定义模板?

通常情况下,项目都是由多个子项目组成,相互之间有一定的依赖关系,每个子项目又有各自依赖的包,也有必需的配置项、公共代码等。当每次创建一个相同结构的项目时,需要手动创建这些子项,手动加入依赖,复制配置项和公共代码等,这是一个没有技术含量、繁琐且容易出错的操作。虽然可以通过建立模板代码库达到以上效果,但是拉取代码库后需要修改项目名称,剔除不需要的依赖包等,也很繁琐。dotnet new命令提供了自定义模板能力,可以根据自己的需要,动态创建项目。

template.json介绍

该文件是创建模板必须的,它包含了创建模板所需的配置信息,下面是必须的配置项。

关于它的完整定义可参考英文文档:https://github.com/dotnet/templating/wiki/Reference-for-template.json

目录结构及建议

 

|--templates |--mytemplate | |--src |  |--.template.config |  | |--template.json |  |--模板源代码 |--mytemplate01  |--src   |--.template.config   | |--template.json   |--模板源代码

 

说明:

templates:可以把多个模板都放在该文件夹下,便于管理。

mytemplate:该文件夹为所需要创建的模板。如果需要多个模板,只需在其同级建立其他模板文件夹,例如mytemplate01。

src:模板源代码存放文件夹。

.template.config/template.json:模板配置信息。

模板源代码:存放自定义的模板源代码。

创建简单模板并使用

现在来创建一个简单的模板,并进行模板的安装和根据模板创建项目。这个模板为三层结构的WebApi项目,平台版本为.Net5,添加Sqlserver驱动包和Dapper包,接口文档使用Swagger,并逐层注入容器。

创建模板项目

新建一个模板项目,命名SingleTplDemo,目录结构如下:

template.json文件内容如下:

 

{ "$schema": "http://json.schemastore.org/template", "author": "Bai Li",  "classifications": [ "Web/WebAPI" ],  "name": "SingleTplDemoAPI",  "identity": "SingleTplDemoAPI",  "shortName": "SingleTpl",  "tags": {  "language": "C#" ,  "type":"project" }, "sourceName": "SingleTplDemo",  "preferNameDirectory": true}

 

项目代码结构如下:

安装模板

使用dotnet new -i命令安装本地模板(后面会介绍安装远程模板),格式如下:

 

dotnet new -i 模板源码路径

 

模板源码路径为.template.config文件夹所在的路径。

模板安装完成后,执行dotnet new命令,可以在已安装模板列表中看到

使用模板创建项目

使用dotnet new命令根据指定模板创建项目,格式如下:

 

dotnet new 模板名称 -n 项目名称 -o 目标路径

 

提示成功,则项目创建成功。

文件夹结构如下:

代码结构如下:

可以看到通过这个模板创建的项目,结构和代码文件一致。

创建动态模板

现在也创建一个三层结构的WebAPI,平台版本为.Net5,ORM使用Dapper,接口文档使用Swagger,并逐层注入容器。跟简单模板不同的是,数据驱动包含SqlServer和MySQL。接下来的计划是,在通过模板创建项目时,仅使用引入一种数据驱动。

创建模板项目

新建项目模板,结构目录结构如下:

template.json文件内容如下:

 

{ "$schema": "http://json.schemastore.org/template", "author": "Bai Li",  "classifications": [ "Web/WebAPI" ],  "name": "DynamicTplDemo",  "identity": "DynamicTplDemo",  "shortName": "DynamicTpl",  "tags": {  "language": "C#" ,  "type":"project" }, "sourceName": "DynamicTplDemo",  "preferNameDirectory": true,	"symbols": {	 "SqlType": {		"type": "parameter",		"description": "Sql类型",		"dataType": "choice",		"defaultValue": "MSSQL",		"isRequired": true,		"choices": [		 {			"choice": "MSSQL",			"description": "MS SQL"		 },		 {			"choice": "MySQL",			"description": "My SQL"		 }		]	 },	 "MSSQL": {		"type": "computed",		"value": "(SqlType == \"MSSQL\")"	 },	 "MySQL": {		"type": "computed",		"value": "(SqlType == \"MySQL\")"	 }	}}

 

该文件引入了新的配置:symbols

参考文档:https://github.com/dotnet/templating/wiki/Reference-for-template.json#symbols

symbols配置项内的有五种类型的子项,这里仅介绍用到的两种类型,其余的请参考官方文档:

SqlType:作为模板的参数,在创建项目时,需要指定可选值choice。

MSSQL、MySQL:通过value中表达式计算的结果,提供给模板作为判定数据库类型的。

项目代码结构如下:

DbContext.cs文件中,通过预编译指令#if等,实现MSSQL和MySQL驱动,以及对应IDbConnection实现的切换。完整内容如下:

 

using System.Data;#if MSSQLusing Microsoft.Data.SqlClient; #elif MySQLusing MySql.Data.MySqlClient;

没有评论:

发表评论