.Net项目模板进阶

友情提示:这篇有点长,有点绕,加油!

上一篇文章,简单的说明了一下.net项目模板的创建,主要是通过在项目文件*.csproj同目录下添加.template.config文件夹和里面的template.json,再用dotnet new -i来安装项目模板的,本篇继续深入。

首先定个小目标:

实现一个web api项目模板,可以选择引入NLog库,选择引入Dapper库;同时希望可以选择用户权限认证方式,这里假设是三种:无,固定角色,自定义策略;还可以在创建项目时,输入文本信息(比如作者信息),上面这些输入项,都是通过模板参数来实现的。

其实仔细分析一下,是三类参数:1、判断类,就是用不用这个三方库;2、选择类,三种授权方式中选一种;3、输入文本类。

同时在上一篇文章中,我们是直接用源码生成模板的,问题来了,不可能让大家都用源码来生成本地模板,这里如果能打成个包,大家使用,就简单多了,确实微信把模板项目生成一个nupkg包,可以上传到nuget.org上,供其他人使用。


那接来看实现步骤吧。

为了大家有直观的感受,我先把创建项目时,需要用户录入的参数展示出来:

这次先看模板文件

1、template.json,在项目文件夹下的.template.config目录下

{"$schema": "http://json.schemastore.org/template","author": "桂素伟","classifications": [ "Common", "桂素伟模板", "WebAPI", "C#9" ],"identity": "GSW  Nuget","name": "GSW  Nuget","shortName": "GSWNuget","tags": {"language": "C#","type": "project"},"sourceName": "GSWNuget","symbols": {"Author": {"type": "parameter","datatype": "text","defaultValue": "","replaces": "author","description": "作者"},"UseNLog": {"type": "parameter","datatype": "bool","defaultValue": "true","description": "是否使用NLog"},"UseDapper": {"type": "parameter","datatype": "bool","defaultValue": "true","description": "是否使用Dapper"},"AuthType": {"type": "parameter","datatype": "choice","defaultValue": "None","choices": [{"choice": "None","description": "None"},{"choice": "Role","description": "Role"},{"choice": "policy","description": "Policy"}]},"None": {"type": "computed","value": "(AuthType == \"None\")"},"Role": {"type": "computed","value": "(AuthType == \"Role\")"},"Policy": {"type": "computed","value": "(AuthType == \"Policy\")"}},"sources": [{"modifiers": [{"condition": "(!UseNLog)","exclude": [ "NLog.config" ]}]}]  
}

"sourceName": "GSWNuget",是项目名称。

"symbols"下是配置模板参数:

UseDapper,UseNLog是bool类型 ,让创建项目的人员来选择是否引入这些三方包。

Author是输入文本类型,其中的replate是要把项目文件中的所有author换成用户输入项目,所以这个名称最好命名的不要那么通用。

AuthType是选择权限的验证规划,这里还在下面增加了三个选择项的运算结果项,bool类型 :None,Role,Policy,是通过用户的选择来决定具体的值。

UseNLog,虽然是个bool类型,但是他的用途特殊,在了json文件的后面,有个sources,这个的作用是决定NLog.config文件,显示不显示在用户的项目中,决定文件的存留与否。


2、ide.host.json,为了在IDE中显示这些值,供用户输入,还需要在template.json同目录下创建一个ide.host.json文件,这个文件的作用就是在ide中把用户录入项友好的提示给用户,同时准备了一个icon.png,来给这个项目模板来充当图标,它的存放位置与ide.host.json在同一级。

{"$schema": "http://json.schemastore.org/vs-2017.3.host","icon": "icon.png","symbolInfo": [{"id": "UseNLog","name": {"text": "Use NLog"},"isVisible": "true"},{"id": "Author","name": {"text": "Author"},"isVisible": "true"}, {"id": "UseDapper","name": {"text": "Use Dapper"},"isVisible": "true"}, {"id": "AuthType","isVisible": "true"}]
}

3、创建web api项目GSWNuget,围绕着上面三个需求展开,先看program.cs文件:

/*********************************作者:author********************************/
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
#if (UseNLog)
using NLog.Web;
#endifnamespace GSWNuget
{public class Program{#if (UseNLog)public static void Main(string[] args){var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();try{logger.Debug("init main");CreateHostBuilder(args).Build().Run();}catch (Exception exception){logger.Error(exception, "Stopped program because of exception");throw;}finally{NLog.LogManager.Shutdown();}}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();}).ConfigureLogging(logging =>{//  logging.ClearProviders();//  logging.SetMinimumLevel(LogLevel.Trace);}).UseNLog();
#elsepublic static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});
#endif}
}

#if  #endif 是判断用户的输入,决定用户项目走的分支,这里是NLog的引入与不引入的分类,其实不有一个点,NLog的库要不要restore,这个在项目文件中再说。

再有一个是author,最终会被展示图的GuiSuWei那个文本替换。

再看一下GSWNuget.csproj,同样是#if,但需要在<!-- -->中,毕竟是xml。

<Project Sdk="Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>net5.0</TargetFramework><Version>2.0.0</Version></PropertyGroup><ItemGroup><!--#if (UseDapper)<PackageReference Include="Dapper" Version="2.0.78" />#endif--><PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" /><PackageReference Include="NLog.Web.AspNetCore" Version="4.12.0" /></ItemGroup>
</Project>

再看一下starup.cs

/*********************************作者:author********************************/
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.OpenApi.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;namespace GSWNuget
{public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }public void ConfigureServices(IServiceCollection services){   #if Nonevar authType = "None";
#endif
#if Rolevar authType = "Role";
#endif
#if Ployvar authType = "Ploy";
#endifservices.AddControllers();services.AddSwaggerGen(c =>{c.SwaggerDoc("v1", new OpenApiInfo { Title = "GSWNuget", Version = "v1" });});}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();app.UseSwagger();app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "GSWNuget v1"));}app.UseHttpsRedirection();app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}}
}

其中的 #if None  ,#if Role,#if Policy是选择后结果的分支对应。

再看一下appsettings.json,在appsettings中是在//后用#if

{#if(UseDapper)//"Dapper": "dapper config",#endif#if(UseNLog)//"LogConfig": "log config",#endif"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Warning"}},"AllowedHosts": "*"
}

到这里,项目基本准备完毕,接下来就要打包成nupkg,这里要用到nuget.exe(这里下载 https://www.nuget.org/downloads),通过命令把模板项目GSWNuget生成nupkg,nuget.exe生成nupkg时需要一个配置文件,GSWNuget.nuspec,这个文件与GSWNuget项目目录在同一级别。

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd"><metadata><id>GSWNuget</id><version>0.0.1</version><description>这是我用来生成Nuget格式的Templage。</description><authors>桂素伟</authors><license type="expression">MIT</license><packageTypes><packageType name="Template" /></packageTypes></metadata><files><file src="GSWNuget\**\*.*" exclude="GSWNuget\**\bin\**\*.*;GSWNuget\**\obj\**\*.*" target="Content" /></files>  
</package>

接下来执行命令:

> .\nuget.exe pack .\GSWNuget.nuspec -OutputDirectory .\nupkg

会在nupkg下生成GSWNuget.1.0.0.nupkg文件

安装GSWNuget项目模板:

> dotnet new -i GSWNuget.1.0.0.nupkg

这里,在我们的项目模板中会增加一个GSWNuget类型的项目模板。


接下来是享受成果的时候了,打开vs,新建项目,搜索GSW,就可以新建自己模板的项目了。

这里可以测试一下不同的选择,生成的是不是想要的结果

找时间做一个自己真正项目模板,再分享给大家。

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

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

相关文章

Web Worker 使用教程

一、概述JavaScript 语言采用的是单线程模型&#xff0c;也就是说&#xff0c;所有任务只能在一个线程上完成&#xff0c;一次只能做一件事。前面的任务没做完&#xff0c;后面的任务只能等着。随着电脑计算能力的增强&#xff0c;尤其是多核 CPU 的出现&#xff0c;单线程带来…

NET问答: C# 中是否有最高效的方式对大文件做 checksum ?

咨询区 Dario&#xff1a;我需要在多台机器间同步大文件&#xff0c;不过文件高达 6G&#xff0c;通常我都是每几周手工同步一次&#xff0c;考虑到文件的文件名经常变&#xff0c;为了检验一致性&#xff0c;我考虑使用 checksum 机制。我的计划是在 源机器 和 目标机器 上做 …

linux宝塔类似工具,有没有比宝塔面板更好的linux运维工具?

我是一个站长,现在建站seo是比较重要的部分,买了独立ip的云服务器主机,为了就是能够seo效果好点.建站优化我不担心,最郁闷的就是linux服务器运维这块,宝塔linux面板是必须安装到服务器上,比较消耗服务器内存,运维比较麻烦.还有就是购买宝塔面板的附带插件比较贵,基本买个网站防…

世界上最难的5种编程语言

每个程序员都熟悉许多编程语言。许多编程语言都是高级的&#xff0c;它们的语法是人类可读的。然而&#xff0c;也有一些低级语言&#xff0c;对于一个人来说&#xff0c;读起来很困难&#xff0c;但是可以理解。您是否遇到过一种既不可读又不可理解的编程语言?有一些编程语言…

云原生 | .NET 5 with Dapr 初体验

【Dapr】| 总结/Edison Zhou分布式应用运行时Dapr目前已经发布了1.1.0版本&#xff0c;阿里云也在积极地为Dapr贡献代码和落地实践。作为一名开发者&#xff0c;自然也想玩一玩&#xff0c;看看Dapr带来的新“视”界到底是怎么样的。1关于DaprDapr&#xff08;Distributed Appl…

Python资料分享来袭,收下不谢!

近几年&#xff0c;机器学习一直很火&#xff0c;小编也有意识地收集了机器学习相关的资源&#xff0c;经过长时间的积累和沉淀&#xff0c;内容涵盖“Python教程”、“编程指南”、“学习视频”等。现在&#xff0c;小编准备将这些资料免费分享给大家&#xff01;扫描下面二维…

我敢说,这是最全的常用设计模式汇总

先分享一个小故事两个年轻人是大学同班同学&#xff0c;他们毕业后一起被同一家公司录取&#xff0c;可以说是站在相同的起跑线上。两个人都对未来信心满满&#xff0c;踌躇满志。其中一人怀抱满腔激情&#xff0c;到处学热门框架&#xff0c;但受限于公司体量和业务逻辑&#…

Python为什么是编程语言中最skr的?

源 / 大数据文摘&#xff08;BigDataDigest&#xff09; 编译 / 小七、Virgil、AlieenPython的出现让计算机编程语言不再是生僻的专业技能&#xff0c;而是常人都能学习和使用的万金油。《经济学人&#xff08;Economist&#xff09;》近日对Python的一篇专题报道&#xff0c…

Linux系统管理员的Bash指南,11条Bash实践经验!

每个职业都有最常用的工具。对于许多系统管理员来说&#xff0c;shell可能是比较熟悉的。在大多数Linux和其他类Unix系统上&#xff0c;默认的shell是Bash。Bash是一个相当古老的程序&#xff0c;它起源于20世纪80年代后期。但它建立在更多&#xff0c;更老的shell上&#xff0…

Asp Net Core 5 REST API 使用 RefreshToken 刷新 JWT - Step by Step(三)

翻译自 Mohamad Lawand 2021年1月25日的文章 《Refresh JWT with Refresh Tokens in Asp Net Core 5 Rest API Step by Step》 [1]在本文中&#xff0c;我将向您演示如何在 Asp.Net Core REST API 中将 Refresh Token 添加到 JWT 身份验证。我们将覆盖的一些主题包含&#xff1…

国外的程序猿可以工作到退休而国内的为什么这么短命(思维认知)

首先我想说明的是国外的程序猿也存在加班&#xff0c;他们也要赶项目&#xff0c;所以加班不算什么原因。真正的原因是我们国内的很大一部分程序猿只是工具的使用者&#xff0c;不会去思考工具的产生和原理&#xff0c;用惯了一个高效的工具就被这个工具套牢成为奴隶&#xff0…

使用 docker 部署 mdnice

使用 docker 部署 mdniceIntro最近 mdnice 的在线版使用开始需要登录才能访问&#xff0c;一方面我觉得我的文章会被保存的他们的服务器上&#xff0c;使用他们的平台就能轻松拿到很多文章的数据&#xff0c;他们甚至是可以直接拿到 markdown 原始内容去别的平台分享转发&#…

细数近年来机器学习研究的几大怪现状

人工智能领域的发展离不开学者们的贡献&#xff0c;然而随着研究的进步&#xff0c;越来越多的论文出现了「标题党」、「占坑」、「注水」等现象&#xff0c;暴增的顶会论文接收数量似乎并没有带来更多技术突破。最近&#xff0c;来自卡耐基梅隆大学的助理教授 Zachary C. Lipt…

50K求聘.NET,我们是认真的!

今年的节奏特别快&#xff0c;不知道你有没有同感&#xff1f;春节刚过&#xff0c;跳槽季仓促开始&#xff0c;打了个疫苗&#xff0c;过了个清明&#xff0c;一转头4月过半&#xff0c;金三银四就快尾声了&#xff0c;真是时光飞逝。当然&#xff0c;手速快的已经offer拿到手…

linux编译redis打包,linux下下载redis,并且编译

1&#xff1a;下载、解压、编译$ wget http://download.redis.io/releases/redis-3.0.6.tar.gz$ tar xzf redis-3.0.6.tar.gz$ cd redis-3.0.6$ make2&#xff1a;结果显示很多error&#xff0c;127&#xff0c;1&#xff0c;2之类的&#xff0c;然后我参考了这个网站https://w…

github star破13k,Dapr 能否引领云原生中间件的未来?

Dapr&#xff08;Distributed Application Runtime &#xff0c;分布式应用运行时&#xff09;是微软新推出的&#xff0c;一种可移植的、serverless 的、事件驱动的运行时&#xff0c;它使开发人员可以轻松构建弹性&#xff0c;无状态和有状态微服务&#xff0c;这些服务运行在…

现在的便签本都这么社会了!?重复写万次还能云端保存

不知模友们有没有感觉到每天脑子要记的事情越来越多不说事情杂七杂八重点是精力有限刚说完的事转眼就忘了想过在电脑贴满便利贴想过本子记录好每天要做什么But ......每天忙的天昏地黑啥都不记得了又懒的随身带着本子太重不好携带真想能有一个神器让这一切不再纠结一款神奇又黑…

C#类类型“.NET技术”

类类型是由字段数据&#xff08;成员变量&#xff09;和操作字段数据的成员&#xff08;属性、方法、构造函数、事件等&#xff09;所构成的自定义类型。其中字段数据表示类实例&#xff08;对象&#xff09;的状态。 在C#中&#xff0c;类使用class关键字定义&#xff0c;例如…

linux ext4 格式化工具,ext4格式化软件 mkfs.ext4 快速格式化

如何在 Windows 下访问 ext4 格式的硬盘你好&#xff0c;介绍两个能在 Windows 下读取ext4分区的软件。第一个是 Ext2Read。它能查看 ext2/3/4 分区并从中拷贝文件和目录&#xff0c;支持 LVM2 和 EXT4 extent &#xff0c;以及递归拷贝整个目录。第二个是本站之前介绍过的 Ext…

信心满满的去面算法工程师,竟然凉了...

我是小A&#xff0c;一个没能当成算法工程师的菜鸡Java工程师&#xff0c;内心却等着上AI这趟车。去年正是人工智能火热的时候&#xff0c;看着各种高薪招聘&#xff0c;我沉寂很久的内心也火热起来了。但是想归想&#xff0c;我内心还是有很多纠结的。自己已经很多年没有碰过高…