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

场景:日常工作中,你可能会碰到需要新建一个全新的解决方案的情况(如公司新起了一个新项目,需要有全新配套的后台程序),如果公司内部基础框架较多、解决方案需要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 库:

640?wx_fmt=png

  • 用于发布的项目一共两个,Template.Console 和 Template.WebApi

    • 其中 Console 项目就是简单的引用了下其他项目进行输出。

    • WebApi 项目简单配置了下依赖注入,你可以将此项目作为 api 模板项目来说

Console 项目概要:

640?wx_fmt=png

WebApi 项目概要:

640?wx_fmt=png

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

    640?wx_fmt=png

  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:短名称,用于在使用“dotnet new -l”命令时显示,安装时也可直接根据该短名称进行安装。

  • sourceName:当我们在使用"dotnet new" 命令进行安装时,如果指定了 -n 或者 -o 选项,那么选项后面的名字会自动替换 sourceName 中指定的名字,因为我们的项目命名规则是 "Template.XXXX",所以这里设定为“Template”,如果你的项目命名规则是“公司.项目.XXX”,那么这里请设定为“公司.项目”。

  • 这里主要说明下 shortName 和 sourceName 这 2 个属性。

安装该模板到本地模板库


dotnet  new  -l

640?wx_fmt=png

dotnet  new  -i  .

640?wx_fmt=png

安装该短名称为 CustomConsole 的模板

假定安装路径为 D:\TestTemplate

 dotnet   new   CustomConsole   -n   Company.Group   -o   .

640?wx_fmt=png

文件夹内容如下:

640?wx_fmt=png

测试:

640?wx_fmt=png

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

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

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

本次示例以 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
    }
  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 文件夹来进行的。

使用 nuget pack 命令打包


nuget   pack   Custom.Template.NetCore.nuspec   -OutputDirectory   .

640?wx_fmt=png

  • 打包后的内容为:

    640?wx_fmt=png

  1. 发布该 nuget 包到 nuget server

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

    640?wx_fmt=png

    nuget push Custom.Template.NetCore.1.0.1.nupkg -Source "你的nuget 服务 url" -ApiKey "你的nuget api key"
  • 你可以直接使用 Nuget Package Explorer 进行发布包

  • 也可以使用 nuget push 来发布,如下:

通过 nuget 安装模板到本地

  • 安装前本地已经安装的模板如下:640?wx_fmt=png

  • 安装

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

    640?wx_fmt=png

  1. 通过模板安装 CustomWebApi

    安装路径为:D:\TestWebApiTemplate

    dotnet  new  CustomWebApi  -n  Company.Group  -o  .
  2. 创建一个解决方案,并将所有的项目添加到解决方案 Company.Group.sln 中

    dotnet new sln -n Company.Groupdotnet 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

    640?wx_fmt=png

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

    640?wx_fmt=png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【BZOJ4916】神犇和蒟蒻(杜教筛)

【BZOJ4916】神犇和蒟蒻(杜教筛) https://www.cnblogs.com/cjyyb/p/8297338.html 杜教筛技巧

E. Number Challenge

E. Number Challenge 推式子 ∑i1a∑j1b∑k1cσ(ijk)∑i1a∑j1b∑k1c∑x∣i∑y∣j∑z∣k(gcd(x,y)1)(gcd(x,z)1)(gcd(y,z)1)∑x1a∑y1b∑z1c⌊ax⌋⌊by⌋⌊cz⌋(gcd(x,y)1)(gcd(x,z)1)(gcd(y,z)1)∑d1aμ(d)∑x1⌊ad⌋⌊adx⌋∑y1⌊bd⌋⌊bdy⌋∑z1c⌊cd⌋(gcd(x,z)1)(gcd(y,z…

时间表(日记)

2021/1/14 今天白天学习还算成功,但是晚饭后拿起手机就开始颓废了,特别是因为听相声实在是无聊而且低俗,所以又忍不住诱惑下载了b站,相比于相声b站的确是有营养的多,但是一旦激起了我的好奇心,尤其是吸引了…

谈谈surging 微服务引擎 2.0的链路跟踪和其它新增功能

一、前言surging是基于.NET CORE 服务引擎。初始版本诞生于2017年6月份,经过NCC社区二年的孵化,2.0版本将在2019年08月28日进行发布,经历二年的发展,已经全部攘括了微服务架构的技术栈,覆盖了从服务注册、服务发现、中…

2019-ACM-ICPC-南京区网络赛-E. K Sum(莫比乌斯反演 + 杜教筛)

K Sum 推式子 Fn(k)∑l11n∑l21n⋯∑lk1n(gcd(l1,l2,…,lk))2∑d1nd2∑l11nd∑l21nd⋯∑lk1nd(gcd(l1,l2,…,lk)1)∑d1nd2∑l11nd∑l21nd⋯∑lk1nd∑t∣gcd(l1,l2,…,lk)μ(t)∑d1nd2∑t1ndμ(t)(ntd)2另Ttd∑T1n(nT)k∑d∣Td2μ(Td)∑i2nFn(i)∑T1n∑i2k(nT)i∑d∣Td2μ(Td)到…

【BZOJ4028】[HEOI2015]公约数数列(分块/数量级很小法)

【BZOJ4028】[HEOI2015]公约数数列 https://www.luogu.com.cn/problem/P4108 求解最靠前的一个位置前缀gcd和前缀异或的乘积恰好等于x,并且要求支持单点修改 首先我们可以发现这个问题没法使用线段树维护,因为不仅前缀没有单调性,而且修改也…

GuGuFishtion(2018 Multi-University Training Contest 7)

GuGuFishtion 推式子 ∑a1m∑b1nϕ(a,b)ϕ(a)ϕ(b)∑a1m∑b1ngcd(a,b)ϕ(gcd(a,b))∑d1mdϕ(d)∑a1md∑b1mdgcd(a,b)1∑d1mdϕ(d)∑a1md∑b1md∑k∣gcd(a,b)μ(k)我们约定n,m&#xff0c;满足n<m∑d1ndϕ(d)∑k1ndμ(k)⌊nkd⌋⌊mkd⌋\sum_{a 1 } ^{m} \sum_{b 1 } ^{n} …

奇淫巧技-Flutter调用C#

前言众所周知&#xff0c;Xamarin应该是.net下的跨平台开发工具。2016年之前还处于收费状态&#xff0c;后被微软收购后开源。但似乎有个现象&#xff0c;开源后的Xamarin发展似乎有些停滞&#xff0c;而且维护Xamarin的团队又很固执不愿变通。社区多次建议UI层应该统一绘图引擎…

【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)

【UOJ#33】【UR #2】树上GCD 求解树上两个点到lca的距离的最大公约数是k的对数 首先我们很容易就想到莫比乌斯反演&#xff0c;那么利用倍数形式&#xff0c;我们只需要求解是i的倍数的对数。 考虑枚举lca&#xff0c;这个问题就和深度有关&#xff0c;那么可以长链剖分&…

.NET World——gPRC概览

官方的定义&#xff1a;gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authen…

51NOD 1220 约数之和(杜教筛)

1220 约数之和 推式子 ∑i1n∑j1nd(i,j)∑i1n∑j1n∑x∣i∑y∣j(gcd(x,y)1)xjy∑d1ndμ(d)∑i1nd∑x∣iix∑j1nd∑y∣jj∑d1ndμ(d)(∑i1nd∑x∣ix)2∑d1ndμ(d)(∑x1nx∑x∣i)2∑d1ndμ(d)(∑x1nxnx)2接下来就是杜教筛求dμ(d)的前缀和&#xff0c;然后再直接分块求∑x1nxnx&…

P4151 [WC2011]最大XOR和路径(线性基)

P4151 [WC2011]最大XOR和路径 对于求解最大异或和路径&#xff0c;首先边可以重复走&#xff0c;最终的结果一定是一条路径和许多环的异或和&#xff0c;因为路径和环之间的边会被走两次&#xff0c;不会被计算&#xff0c;所以我们可以通过dfs树求解所有的环的线性基&#xf…

P6222 「P6156 简单题」(反演 + 积性函数线性筛)

P6156 简单题 推式子 ∑i1n∑j1n(ij)kf(gcd(i,j))gcd(i,j)∑i1n∑j1n(ij)kμ2(gcd(i,j))gcd(i,j)∑d1nμ2(d)dk1∑i1nd∑j1nd(ij)k(gcd(i,j)1)∑d1nμ2(d)dk1∑p1ndp2μ(p)∑i1npd∑j1npd(ij)ktpd,f(n)∑i1n∑j1n(ij)k∑t1nf(nt)tk∑d∣tμ2(d)μ(td)d\sum_{i 1} ^{n} \sum_{…

推荐高质量的公众号,值得跟进学习!

为大家推荐几个高质量的公众号&#xff1a;当你迷茫的时候刷刷这些大公司的牛人所运营的公众号&#xff0c;就可以知道自己的不足&#xff0c;不是仅仅局限于.NET技术之下&#xff0c;通过他们扩展我们的知识宽度&#xff0c;我们可以一起来学习。人工智能爱好者社区专注人工智…

P3733 [HAOI2017]八纵八横(线性基/线段树分治)

P3733 [HAOI2017]八纵八横 这是那道线性基的加强版&#xff0c;现在要求从1节点出发的一条路径异或和最大&#xff0c;并且还要支持修改权值和加边删边。 我们可以直接线段树分治然后将所有修改用vector存下来&#xff0c;然后最后dfs一遍整个线段树&#xff0c;然后每次类似…

.net core redis的全套操作

Redis支持五种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;列表&#xff09;&#xff0c;set&#xff08;集合&#xff09;及zset(sorted set&#xff1a;有序集合)。Redis支持主从同步…

二次剩余模板

二次剩余模板 x2≡n(modp)x ^ 2 \equiv n \pmod px2≡n(modp) /*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc.h>#define mp make_pair #define pb push_back #define endl \n #define mid (l r >> 1) #define l…

CF938G Shortest Path Queries(线性基/线段树分治/异或)

CF938G Shortest Path Queries 支持加边删边和查询两点之间的异或最短路&#xff0c;我们可以使用线段树分治&#xff0c;然后利用线性基求解。 但是这里图可能不是联通的&#xff0c;所以查询两点之间的异或和需要边带权并查集维护&#xff0c;然后还不能路径压缩&#xff0…

Stack Overflow引入CROKAGE,搜问题不用再东拼西凑

许多开发者使用 Stack Overflow 搜索开发中遇到的问题&#xff0c;有时候需要查询的结果中有通俗的讲解&#xff0c;而且最好还能够带上代码 demo&#xff0c;但是两者同时很完美地满足要求还是比较困难的。不过最近 Stack Overflow 官方博客上介绍了一种智能化的技术&#xff…

P2487 [SDOI2011]拦截导弹(cdq分治/计数问题思想)

P2487 [SDOI2011]拦截导弹 求解二维上的LIS&#xff0c;并且要求出每个点的选中概率。 首先对于每个点的选中概率&#xff0c;可以通过方案数计算&#xff0c;那么就是选中它的方案数除以总方案数。关键在于选中它的方案数怎么求&#xff0c;可以通过以它开头的LIS方案数和以…