前言:

 使用“宇宙最强IDE”开发项目时,都需要根据不同情况选择一个项目模板,来满足开发需求:如下

 

VS为我们提供了基础的项目模板,但现有项目模板未包含基础功能如:日志输出、审计日志、SwaggerUI、认证等,那么我们能否自定义项目模板来满足我们的需求呢?答案当然是肯定的

 那么接下来开始实现自定义项目模板的创建

一、自定义项目模板创建

 本次我们来创建一个实现了基础功能的webapi模板

 创建自定义的项目模板,有以下几个步骤:

 1、创建原始的项目(模板项目)

  创建WebApi项目:

   

  实现WebApi相关基础功能:SwaggerUI、认证、性能监控(MiniProfiler)等基础功能;可以在之前博客内容中查看实现具体方式

 2、替换模板项目的参数

  此时模板的基础功能已经实现,但是在创建项目时,会根据输入的项目名称;来设置代码中的命名空间、输出程序名称等信息。

  那么是如何实现的呢?——模板参数

  当前支持的内置项目参数如下表:(模板参数区分大小写。)

参数 说明
clrversion 公共语言运行时 (CLR) 的当前版本。
ext_* 将 ext_ 前缀添加到任何参数,以引用父模板的变量。 例如,ext_safeprojectname
guid[1-10] 一个用于替换项目文件中的项目 GUID 的 GUID。 可指定最多 10 个唯一的 GUID(例如,guid1)。
itemname 在其中使用参数的文件的名称。
machinename 当前的计算机名称(例如,Computer01)。
projectname 创建项目时由用户提供的名称。
registeredorganization 来自 HKLM\Software\Microsoft\Windows NT\CurrentVersion\RegisteredOrganization 的注册表项值。
rootnamespace 当前项目的根命名空间。 此参数仅适用于项模板。
safeitemname 与 itemname 相同,但所有不安全字符和空格替换为了下划线。
safeitemrootname 与 safeitemname 相同。
safeprojectname 用户在创建项目时提供的名称,但名称中删除了所有不安全字符和空格。
time 以 DD/MM/YYYY 00:00:00 格式表示的当前时间。
specifiedsolutionname 解决方案的名称。 在选中“创建解决方案目录”时,specifiedsolutionname 具有解决方案名称。 在未选中“创建解决方案目录”时,specifiedsolutionname 为空。
userdomain 当前的用户域。
username 当前的用户名称。
webnamespace 当前网站的名称。 此参数在 Web 窗体模板中用于保证类名是唯一的。 如果网站在 Web 服务器的根目录下,则此模板参数解析为 Web 服务器的根目录。
year 以 YYYY 格式表示的当前年份。

  如:设置代码文件中命名空间定义:

namespace $safeprojectname$
{
/// <summary>
/// 作者:$username$
/// 时间:$time$
/// 机器名:$machinename$
/// 项目名:$projectname$
/// </summary>
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}

  如代码中需要使用项目名称依旧采用$safeprojectname$;如:

public void ConfigureServices(IServiceCollection services)
{
//注册Swagger生成器,定义一个和多个Swagger 文档
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "$safeprojectname$ API", Version = "v1" });
// other
});
}

  除了VS自带的模板参数外,用户还可以自定义模板参数,但现实用到的不多

 3、导出模板源项目,指定模板项目设置名称、说明、图标等内容

  模板基本内容实现完成后,则可以进行模板导出操作,步骤如下:

  A、进入菜单:项目->导出模板

  

  B、弹出:导出模板向导页面

  

  C、设置模板相关信息,点击完成;则模板创建成功

  

  输出位置为自定义模板导出存储位置;

  【自动将模板导入 Visual Studio】选项,选中后会将项目模板复制一份,放入到特定的文件夹中,下次建立新项目就可以搜索使用。

 4、模板项目添加语言、平台和项目类型等标签

  前面的步骤已经完成对模板的创建,但是在创建项目时,可以根据项目平台、语言、项目类型标签过滤,那么如何实现项目模板标签呢?

  接下来对3步骤中生成的项目模板进行研究:

  打开模板文件的压缩文件中发现了模板文件

  解压文件后,对该文件进行编辑,添加语言标签(LanguageTag)、平台标签(PlatformTag)、项目类型标签(ProjectTypeTag):  

<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
<TemplateData>
<!--项目名称-->
<Name>ApiTemplate</Name>
<!--项目描述-->
<Description>基础API模板:支持SwaggerUI、认证、性能监控等基础功能</Description>
<!--项目类型-->
<ProjectType>CSharp</ProjectType>
<ProjectSubType>
</ProjectSubType>
<SortOrder>1000</SortOrder>
<!--指定在实例化项目时是否创建包含文件夹。-->
<CreateNewFolder>true</CreateNewFolder>
<!--缺省名称-->
<DefaultName>ApiTemplate</DefaultName>
<ProvideDefaultName>true</ProvideDefaultName>
<LocationField>Enabled</LocationField>
<EnableLocationBrowseButton>true</EnableLocationBrowseButton>
<CreateInPlace>true</CreateInPlace>
<!--语言标签-->
<LanguageTag>CSharp</LanguageTag>
<LanguageTag>Javascript</LanguageTag>
<!--平台标签-->
<PlatformTag>Windows</PlatformTag>
<PlatformTag>Linux</PlatformTag>
<!--项目标签-->
<ProjectTypeTag>Web</ProjectTypeTag>
<!--图标-->
<Icon>__TemplateIcon.png</Icon>
<PreviewImage>__PreviewImage.png</PreviewImage>
</TemplateData>
<TemplateContent>
<Project TargetFileName="ApiProjectTemplates.csproj" File="ApiProjectTemplates.csproj" ReplaceParameters="true">
<Folder Name="Properties" TargetFolderName="Properties">
<ProjectItem ReplaceParameters="true" TargetFileName="launchSettings.json">launchSettings.json</ProjectItem>
</Folder>
<Folder Name="Controllers" TargetFolderName="Controllers">
<ProjectItem ReplaceParameters="true" TargetFileName="WeatherForecastController.cs">WeatherForecastController.cs</ProjectItem>
</Folder>
<ProjectItem ReplaceParameters="true" TargetFileName="appsettings.json">appsettings.json</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="appsettings.Development.json">appsettings.Development.json</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="JwtSetting.cs">JwtSetting.cs</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="Program.cs">Program.cs</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="Startup.cs">Startup.cs</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="WeatherForecast.cs">WeatherForecast.cs</ProjectItem>
</Project>
</TemplateContent>
</VSTemplate>

  下表是 Visual Studio 中可用的以上描述标签的取值内容:

语言标签(LanguageTag) 平台标签(PlatformTag) 项目类型标签(ProjectTypeTag)
C (cpp) Android (android) 云 (cloud)
C# (csharp) Azure (azure) 控制台 (console)
F# (fsharp) iOS (ios) 桌面 (desktop)
Java (java) Linux (linux) 扩展 (extension)
JavaScript (javascript) macOS (macos) 游戏 (games)
Python (python) tvOS (tvos) IoT (iot)
查询语言 (querylanguage) Windows (windows) 库 (library)
TypeScript (typescript) Xbox (xbox) 机械学习 (machinelearning)
Visual Basic (visualbasic)   移动 (mobile)
    Office (office)
    其他 (other)
    服务 (service)
    测试 (test)
    UWP (uwp)
    Web (web)

  最后将修改的文件打包成zip压缩(必须为zip文件)文件后,复制到项目模板所在位置(%USERPROFILE%\Documents\Visual Studio 2019\Templates\ProjectTemplates)    

二、 自定义项目模板使用

 前面步骤已完成模板创建,接下来就验证模板是否生效:

 打开vs进入项目创建界面,搜索API,如下:

 

 

 

 到此项目设置的标签以及代码中命名空间、注释都已生效。项目模板效果已实现

三、总结:

 所有项目模板和项模板(无论是与 Visual Studio 一起安装的还是由你创建的)均通过使用相同的原则工作并具有类似的内容。 所有模板均包含以下项:

  • 使用模板时要创建的文件。 这些文件包括源代码文件、嵌入资源、项目文件等。
  • 一个 .vstemplate 文件,其中包含根据模板创建项目或项以及在“创建新项目”页面或“添加新项”对话框中显示模板所需的元数据。当这些文件压缩成 .zip 文件并放在正确的文件夹时,Visual Studio 将自动在以下位置显示这些文件:
  • 在“创建新项目”页面中显示项目模板。
  • 在“添加新项”窗口中显示项模板。

 项目模板作用非常大,可以将日常积累的功能合并在模板中,可以避免项目开发中重复造轮子,提高开发效率

参考内容

 https://docs.microsoft.com/zh-cn/visualstudio/ide/creating-project-and-item-templates?view=vs-2019

 https://docs.microsoft.com/zh-cn/visualstudio/extensibility/vsix-project-template?view=vs-2019

 https://docs.microsoft.com/zh-cn/visualstudio/extensibility/vstemplate-element-visual-studio-templates?view=vs-2019

VS2019 自定义项目模板的更多相关文章

  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. .NET Core - 自定义项目模板

    前言: 前面介绍 自定义项目模板 中介绍了一种简单的方式--通过创建项目导出为项目模板方式实现.本次将采用dotenet cil(手脚架)来创建项目模板. 那么,我们首先看下当前dotnet 支持的项 ...

  5. Visual Studio 自定义项目模板

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

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

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

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

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

  8. 如何利用 Visual Studio 自定义项目或工程模板

    在开发项目的时候,由其是商业性质的大型项目时,往往需要在每个代码文件上都加上一段关于版权.开发人员的信息,并且名称空间上都需要带有公司的标志.这个时候,是选择在开发的时候手动添加还是自动生成呢? 我们 ...

  9. vs创建项目模板和项模板

    原文地址:https://msdn.microsoft.com/zhcn/library/xkh1wxd8(v=vs.140).aspx 如何:创建项目模板 Visual Studio 2015   ...

随机推荐

  1. http cache & 浏览器缓存,存储位置的优先级,条件?

    http cache & 浏览器缓存,存储位置的优先级,条件? memory cache disk cache 浏览器缓存,存储位置的优先级,条件, 机制,原理是什么? from memory ...

  2. js 获取包含emoji的字符串的长度

    let emoji_exp = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ ...

  3. css useful skills blogs

    css useful skills blogs https://caniuse.com/ https://css-tricks.com https://css-tricks.com/almanac/p ...

  4. qt 移动窗口MoveWindow

    RECT r; GetWindowRect(this->gameHwnd, &r); // 获取窗口的宽度和高度 int nWidth = r.right - r.left; int n ...

  5. nodejs 调用win32 api

    video 教程文件 win32 api >node -v v12.16.1 >npm install -g node-gyp >npm i @saleae/ffi >node ...

  6. NGK福利再升级,1万枚VAST限时免费送

    NGK在推出持有算力获得SPC空投活动后,福利再升级,于美国加州时间2021年2月8日下午4点推出新人福利活动,注册NGK成为新会员,即可获得0.2枚VAST奖励. VAST免费福利送活动仅送出1万枚 ...

  7. 负利率时代,NGK DeFi是否会推动资本向加密货币迁徙?

    2020年,全球经济危机持续,贸易战争以及天灾人祸使得全球各国的经济雪上加霜,为了挽救低迷的经济,美国.欧洲.日本各国央行竞相放水,全球正在滑入负利率时代. 负利率下,资本加速从法币向数字货币迁徙,因 ...

  8. NGK主网上线后内存价格上涨30倍,NGK RAM是否值得买入?

    美国加州时间10月14日上午10时,NGK主网正式上线.因为市场预期向好,NGK上线以后迎来了大涨,NGK的代币价格上涨了10倍,内存价格上涨了30倍.目前,NGK上线已经有五天的时间,盘面上已经出现 ...

  9. 微信小程序:日期组件picker的使用

    1.页面代码 <view class="right"> <picker mode="date" value="{{material. ...

  10. 微信小程序:页面全局参数(注意不是小程序的全局变量globalData)

    为什么要使用页面全局参数:方便使用数据. 由于总页数需要再另外的一个方法中使用,所以要把总页数变成一个页面全局参数.因为取数据使用this.xxx即可,中间不用加data,给页面全局参数赋值页方便,直 ...