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

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

目录结构及建议

 

|--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,目录结构如下:

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

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 }

 

项目代码结构如下:

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

安装模板

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

 

dotnet new -i 模板源码路径

 

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

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

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

使用模板创建项目

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

 

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

 

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

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

文件夹结构如下:

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

代码结构如下:

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

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

创建动态模板

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

创建模板项目

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

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

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

参考文档:

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

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

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

项目代码结构如下:

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

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxygs.html