前言:

 前面介绍 自定义项目模板 中介绍了一种简单的方式——通过创建项目导出为项目模板方式实现。本次将采用dotenet cil(手脚架)来创建项目模板。

 那么,我们首先看下当前dotnet 支持的项目模板:

 

 可以看到当前dotnet中已经提供了很多模板项目,那么如何根据项目开发的积累内容通过dotnet cli创建一个自己的项目来提升开发效率呢?

1、实现自定义项目模板

 自定义模板项目模板肯定就需要模板实现,本次就使用使用之前文章中项目结构作为模板项目来实现自定义项目模板

 

 接下跟着步骤来创建模板项目

  • 创建模板配置文件

   在项目根文件夹中创建文件夹:.template.config  并在目录下创建 template.json 。如下图:

   

  • 定义项目模板相关信息

   修改template.json内容为以下内容:

{
"author": "cwsheng", //必须
"classifications": [ "Web/WebAPI" ], //必须,这个对应模板的Tags
"name": "ApiTmp", //必须,这个对应模板的Templates
"identity": "ApiTemplate", //可选,模板的唯一名称
"shortName": "apitmp", //必须,这个对应模板的Short Name
"tags": {
"language": "C#" ,
"type":"project"
},
"sourceName": "ApiTemplate", // 可选,要替换的名字
"preferNameDirectory": true // 可选,添加目录
}

   注意:shortName和sourceName

    • author:模板作者
    • classifications:模板特征标识。上文举例的配置是因为我自定义的模板包括了console和webapi。
    • identity:此模板的唯一名称
    • name:用户看到的模板名称
    • shortName:短名称。当使用CLI命令创建模板项目时,使用短名称将利于使用。
    • sourceName:模板替换的关键文本,使用时需要注意,要选择合适的替换文本,不然容易误伤代码。
  • 项目模板安装

   接下来进入项目目录,将这个模板安装到cli中。使用 dotnet new -i  进行模板的安装。

dotnew new -i TempDemo

  

   卸载项目模板:

dotnet new -u 模板目录
  • 应用项目模板

   使用命令创建项目:

dotnet new apiTmp -n Test -o .

apiTmp:是模板配置文件中指定的shortName。

-n:指定的是将项目中出现的所有文本MyJob替换为Test,因为配置中sourceName是ApiTemplate,可按需配置。

-o:指定的是生成项目输出目录,上述命令生成项目输出到当前目录。

   结果如下图:    

    

 

  到此通过dotnet cli创建项目模板已完成,但仅仅这样完全不能满足日常工作需求。
  如:
A项目需要日志记录,但B项目不需要日志记录;A项目需要制定PG数据库作为存储方式,B项目需要制定MySQL作为存储方式。

  那么这些问题能否在项目创建时根据设置而满足项目需求呢?

2、模板项目进阶用法

  • 文件过滤:根据参数过滤制定文件和代码内容

  a) 定义参数:在 template.json  中添加以下内容:EnableAuditLog-参数名称

{
//……
"symbols": {
//是否使用审计日志功能
"EnableAuditLog": {
"type": "parameter", //它是参数
"dataType": "bool", //bool类型的参数
"defaultValue": "false" //默认是不启用
}
},
"sources": [
{
"modifiers": [
{
"condition": "(!EnableAuditLog)", //条件,由EnableAuditLog参数决定
"exclude": [ //排除下面的文件
"AuditLogDemo/Fliters/AuditLogActionFilter.cs"
]
}
]
}
]
}

  b) 取消审计日志生效位置:

  

 c) 重新生成模板,查看当前模板支持的参数:

  

  d) 创建项目检查设置是否生效:

  

  • 选择执行:根据变量值选择程序集引用

  a) 添加参数:DbType指定选项数据库类型

  "symbols": {
//数据源类型"DbType": {
"type": "parameter", //它是参数
"datatype": "choice", //选项类型
"choices": [ //选项取值
{
"choice": "MsSQL",
"description": "MS SQL Server"
},
{
"choice": "MySQL",
"description": "MySQL"
},
{
"choice": "PgSQL",
"description": "PostgreSQL"
},
{
"choice": "SQLite",
"description": "SQLite"
},
{
"choice": "None",
"description": "None"
}
],
"defaultValue": "None",
"description": "The type of SQL to use"
},
"MsSQL": {
"type": "computed",
"value": "(DbType == \"MsSQL\")"
},
"MySQL": {
"type": "computed",
"value": "(DbType == \"MySQL\")"
},
"PgSQL": {
"type": "computed",
"value": "(DbType == \"PgSQL\")"
},
"SQLite": {
"type": "computed",
"value": "(DbType == \"SQLite\")"
},
"None": {
"type": "computed",
"value": "(DbType == \"None\")"
}
}

   b) 修改项目文件:根据条件选择对应程序集

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup> <ItemGroup Condition="'$(None)'!='True'">
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.8" />
</ItemGroup>
<ItemGroup Condition="'$(SQLite)' == 'True'">
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.8" />
</ItemGroup>
<ItemGroup Condition="'$(MsSQL)' == 'True'">
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.8" />
</ItemGroup>
<ItemGroup Condition="'$(PgSQL)' == 'True'">
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.4" />
</ItemGroup>
</Project>

   c) 使用数据库处,同步处理

#if (!None)
//审计日志存储
services.AddDbContext<AuditLogDBContent>(options =>
{
string conn = Configuration.GetConnectionString("LogDB");
#if Sqlite
options.UseSqlite(conn, options =>
{
options.MigrationsAssembly("AuditLogDemo");
});
#endif
#if PgSQL
options.UseNpgsql(conn);
#endif #if MsSQL
options.UseSqlServer(conn);
#endif });
#endif

   d) 更新模板后,查看已生成了对应参数

    

   e) 创建项目查看生效情况:    

//不使用数据库
dotnet new apiTmp -n AA -D None //使用PG数据库
dotnet new apiTmp -n BB -D PgSQL

    

   可以看到项目引用和程序代码都根据传入参数生成了。    

3、项目模板打包发布

 好东西当然不能只给自己使用,而应该怎么将生成的模板给大家使用呢?——Nuget 包发布

 a)在模板根目录创建一个 nuspec文件:apiTmp.nuspec

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>apiTmp</id>
<version>1.0.0</version>
<description> WebApi Template </description>
<authors>cwshegn</authors>
<packageTypes>
<packageType name="Template" />
</packageTypes>
</metadata>
</package>

 b)使用Nuget Pack 命令打包  

 nuget pack apiTmp.nuspec -OutputDirectory .

 c)  发布到nuget服务,给小伙伴们下载使用

总结:

 通过dotnet cli 创建的模板项目,能更方便的根据项目需求生成对应的项目结构,提升开发效率。

 可以动手把积累的好项目打包成一个模板项目给小伙伴们使用

参考:

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

https://github.com/dotnet/dotnet-template-samples

https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-new

https://docs.microsoft.com/en-us/nuget/install-nuget-client-tools

.NET Core - 自定义项目模板的更多相关文章

  1. VS自定义项目模板:[2]创建VSIX项目模板扩展

    VS自定义项目模板:[2]创建VSIX项目模板扩展 听语音 | 浏览:1237 | 更新:2015-01-02 09:21 | 标签:软件开发 1 2 3 4 5 6 7 分步阅读 一键约师傅 百度师 ...

  2. [Visual Studio] 自定义项目模板(.vsix扩展)

    VS自定义项目模板:[2]创建VSIX项目模板扩展 听语音 | 浏览:1237 | 更新:2015-01-02 09:21 | 标签:软件开发 1 2 3 4 5 6 7 分步阅读 一键约师傅 百度师 ...

  3. 用Visual Studio2019自定义项目模板

    项目模板简介 众所周知,在我们使用VS新建项目时,都需要选择一个项目模板,如下图: 我们选择完项目模板进行创建,创建完成之后,可以发现项目中已经包含了一些基础的文件.例如MVC: 可以看到,MVC项目 ...

  4. VS2019 自定义项目模板

    前言: 使用"宇宙最强IDE"开发项目时,都需要根据不同情况选择一个项目模板,来满足开发需求:如下 VS为我们提供了基础的项目模板,但现有项目模板未包含基础功能如:日志输出.审计日 ...

  5. 使用 .NET CORE 创建 项目模板,模板项目,Template

    场景:日常工作中,你可能会碰到需要新建一个全新的解决方案的情况(如公司新起了一个新项目,需要有全新配套的后台程序),如果公司内部基础框架较多.解决方案需要DDD模式等,那么从新起项目到各种依赖引用到能 ...

  6. Visual Studio 自定义项目模板

    经常我们需要新建一个项目,然后新建我们的View文件夹,ViewModel文件夹,Model文件夹,还有把我们的ViewModelBase放入我们的VIewModel,如果还用框架,还需要加上好多. ...

  7. VS2013 自定义项目模板以及制作.vsix文件

    一.环境检查 打开VS2013新建项目.如果在"其他项目类型"中不包含扩展性节点,则需要下载并安装vs2013 SDK. 二.创建项目模板 1,在VS中新建一个类库项目(此处仅以类 ...

  8. 在VisualStudio2013,2015中如何安装自定义项目模板

    For example, I want to install EP prj template: AxWebProject.zip Copy AxWebProject.zip zip file into ...

  9. 从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板

    标题:从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11155 ...

随机推荐

  1. 翻译:《实用的Python编程》02_05_Collections

    目录 | 上一节 (2.4 序列) | 下一节 (2.6 列表推导式) 2.5 collections 模块 collections 模块为数据处理提供了许多有用的对象.本部分简要介绍其中的一些特性. ...

  2. oracle ORA-00257

    su - oracle sqlplus /nolog conn / as sysdba select * from v$flash_recovery_area_usage; select sum(pe ...

  3. cocos2dx创建工程

    p.p1 { margin: 0; font: 17px "Helvetica Neue"; color: rgba(69, 69, 69, 1) } 官网镇楼: http://w ...

  4. 鸿蒙的js开发模式19:鸿蒙手机下载python服务器端文件的实现

    目录:1.承接上篇鸿蒙客户端上传文件2.域名通过内网穿透工具3.python服务器端代码4.鸿蒙手机的界面和业务逻辑5.<鸿蒙的js开发模式>系列文章合集 1.承接上篇鸿蒙客户端上传文件, ...

  5. 用c++解一元二次方程

    解方程 github项目地址 这两天得知初二的表妹学了一元二次方程,听说还不会解,我就想着试试用C语言编写解方程. 一元二次方程 用公式法 这种方法效果很好: #include"funct. ...

  6. 【pytest官方文档】解读fixtures - 7. Teardown处理,yield和addfinalizer

    当我们运行测试函数时,我们希望确保测试函数在运行结束后,可以自己清理掉对环境的影响. 这样的话,它们就不会干扰任何其他的测试函数,更不会日积月累的留下越来越多的测试数据. 用过unittest的朋友相 ...

  7. mysql内一些可以报错注入的查询语句

        一.exp() 取反参数 该函数简单来说就是,以e为底的对数,在当传递一个大于709的值时,函数exp()就会引起一个溢出错误,取反则可以导致很小的数值变得很大,比如说0 这样既可配合使用,e ...

  8. matplotlib常规使用方法

    1,指定图片大小和像素 Python绘图问题:Matplotlib中指定图片大小和像素 2,绘图命令的基本架构及其属性设置 绘图与可视化 3,python基础语法(二)--- plt的一些函数使用 p ...

  9. 技术分享PPT整理(二):C#常用类型与数据结构

    这篇博客起源于我对Dictionary.List.ArrayList这几个类区别的好奇,当时在改造公司的旧系统,发现很多地方使用了ArrayList,但我们平时用的多是泛型集合List,改造的时候要全 ...

  10. 设计模式——从工厂方法模式到 IOC/DI思想

    回顾简单工厂 回顾:从接口的角度去理解简单工厂模式 前面说到了简单工厂的本质是选择实现,说白了是由一个专门的类去负责生产我们所需要的对象,从而将对象的创建从代码中剥离出来,实现松耦合.我们来看一个例子 ...