通过 .NET CORE 提供的项目模板,减少重复劳动,提高效率

原文链接:https://blog.zhuliang.ltd/2019/07/backend/custom-template-using-dotnetcore.html

转载请注明出处。
场景:日常工作中,你可能会碰到需要新建一个全新的解决方案的情况(如公司新起了一个新项目,需要有全新配套的后台程序),如果公司内部基础框架较多、解决方案需要DDD模式等,那么从新起项目到各种依赖引用到能实际可用,一大堆的配置都需要重新设定、测试,耗时耗力,根据项目的大小,往往可能需要 1-2 小时甚至更久。

在 .net core 之前,虽然有相关的解决方法可以实现“项目模板”这个需求,但在具体操作时很不方便,从 .net core 1.0 开始,提供了“模板引擎”,增加了 dotnet new --install(-i) 命令和选项,通过该命令,可以让你方便的创建属于你自己的项目模板。

通过本文你可以了解和掌握:

  1. 掌握如何将一个现有解决方案中的项目作为项目模板。
    1. 掌握如何在本地创建项目模板并安装和使用。
    2. 掌握如何将本地模板打包成 nuget 包,并通过包 id 进行安装使用该模板。
  2. 了解、掌握简单的 dotnet 和 nuget 命令及其配置。(windows 和 mac 会做差异说明)

准备工作

本次项目结构如下(DDD):

你可以在我的 github 库:https://github.com/ArtechChu/Template 直接下载该模板源码

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

Console 项目概要:

image

WebApi 项目概要:

image

将本地项目作为本地模板,通过命令进行安装和使用

  1. 本次示例以 Console 为例,将控制台项目涉及到的项目拷贝一份到如下文件夹中:

    image
  2. 手动创建一个名为“.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”,那么这里请设定为“公司.项目”。

安装该模板到本地模板库

# 通过如下命令查看当前本机已安装模板:
dotnet  new  -l 
image
# 模板安装命令:dotnet  new  i <path | nugetId>
# 这里因为是安装本地模板,直接使用路径(绝对和相对均可)
dotnet  new  -i  .
image
  1. 安装该短名称为 CustomConsole 的模板

假定安装路径为 D:\TestTemplate

假定新起的项目名为“Company.Group”

# 这里使用 -n 和 -o 选项来分别指定新项目的名字以及输出目录
# 设定新项目的名字为“Company.Group”,因为当前定位已经在 TestTemplate 文件夹内,所以直接用“.”,如下:
 dotnet   new   CustomConsole   -n   Company.Group   -o   .
image

文件夹内容如下:

image
  • 使用模板新建的项目文件夹自动为“Company.Group.XXXX”

测试:

image

更多关于 template.json 的说明请参考:http://json.schemastore.org/template

  • 在 template.json 中,你还可以指定 symbols 等,来实现更多的自定义功能,如联动预编译指令等等。

将本地项目打包为 nuget 包,并通过命令进行安装和使用

本次示例以 Console +WebApi 为例,在 Templates\Nuget 文件夹中,建立 Content 文件夹用于存放 nuget 包内容,具体如下:

image
  • 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
}
  1. 在 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 文件夹来进行的。
  1. 使用 nuget pack 命令打包

# 注意路径的相对位置
nuget   pack   Custom.Template.NetCore.nuspec   -OutputDirectory   .

image
  • 打包后的内容为:
image
  1. 发布该 nuget 包到 nuget server

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

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

安装路径为:D:\TestWebApiTemplate

dotnet  new  CustomWebApi  -n  Company.Group  -o  .
  1. 创建一个解决方案,并将所有的项目添加到解决方案 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
image

如果你用的是 mac / linux ,则可以直接用 globbing pattern 来添加,如下:

dotnet sln Company.Group.sln add **/*.csproj
image

参考

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342