参考官方文档:
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;
没有评论:
发表评论