VS2019 自定義項目模板的實現(xiàn)方法
前言:
使用“宇宙最強IDE”開發(fā)項目時,都需要根據(jù)不同情況選擇一個項目模板,來滿足開發(fā)需求:如下

VS為我們提供了基礎(chǔ)的項目模板,但現(xiàn)有項目模板未包含基礎(chǔ)功能如:日志輸出、審計日志、SwaggerUI、認證等,那么我們能否自定義項目模板來滿足我們的需求呢?答案當然是肯定的
那么接下來開始實現(xiàn)自定義項目模板的創(chuàng)建
一、自定義項目模板創(chuàng)建
本次我們來創(chuàng)建一個實現(xiàn)了基礎(chǔ)功能的webapi模板
創(chuàng)建自定義的項目模板,有以下幾個步驟:
1、創(chuàng)建原始的項目(模板項目)
創(chuàng)建WebApi項目:

實現(xiàn)WebApi相關(guān)基礎(chǔ)功能:SwaggerUI、認證、性能監(jiān)控(MiniProfiler)等基礎(chǔ)功能;可以在之前博客內(nèi)容中查看實現(xiàn)具體方式
2、替換模板項目的參數(shù)
此時模板的基礎(chǔ)功能已經(jīng)實現(xiàn),但是在創(chuàng)建項目時,會根據(jù)輸入的項目名稱;來設(shè)置代碼中的命名空間、輸出程序名稱等信息。
那么是如何實現(xiàn)的呢?——模板參數(shù)
當前支持的內(nèi)置項目參數(shù)如下表:(模板參數(shù)區(qū)分大小寫。)
| 參數(shù) | 說明 |
|---|---|
| clrversion | 公共語言運行時 (CLR) 的當前版本。 |
| ext_* | 將 ext_ 前綴添加到任何參數(shù),以引用父模板的變量。 例如,ext_safeprojectname。 |
| guid[1-10] | 一個用于替換項目文件中的項目 GUID 的 GUID。 可指定最多 10 個唯一的 GUID(例如,guid1)。 |
| itemname | 在其中使用參數(shù)的文件的名稱。 |
| machinename | 當前的計算機名稱(例如,Computer01)。 |
| projectname | 創(chuàng)建項目時由用戶提供的名稱。 |
| registeredorganization | 來自 HKLM\Software\Microsoft\Windows NT\CurrentVersion\RegisteredOrganization 的注冊表項值。 |
| rootnamespace | 當前項目的根命名空間。 此參數(shù)僅適用于項模板。 |
| safeitemname | 與 itemname 相同,但所有不安全字符和空格替換為了下劃線。 |
| safeitemrootname | 與 safeitemname 相同。 |
| safeprojectname | 用戶在創(chuàng)建項目時提供的名稱,但名稱中刪除了所有不安全字符和空格。 |
| time | 以 DD/MM/YYYY 00:00:00 格式表示的當前時間。 |
| specifiedsolutionname | 解決方案的名稱。 在選中“創(chuàng)建解決方案目錄”時,specifiedsolutionname 具有解決方案名稱。 在未選中“創(chuàng)建解決方案目錄”時,specifiedsolutionname 為空。 |
| userdomain | 當前的用戶域。 |
| username | 當前的用戶名稱。 |
| webnamespace | 當前網(wǎng)站的名稱。 此參數(shù)在 Web 窗體模板中用于保證類名是唯一的。 如果網(wǎng)站在 Web 服務(wù)器的根目錄下,則此模板參數(shù)解析為 Web 服務(wù)器的根目錄。 |
| year | 以 YYYY 格式表示的當前年份。 |
如:設(shè)置代碼文件中命名空間定義:
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自帶的模板參數(shù)外,用戶還可以自定義模板參數(shù),但現(xiàn)實用到的不多
3、導(dǎo)出模板源項目,指定模板項目設(shè)置名稱、說明、圖標等內(nèi)容
模板基本內(nèi)容實現(xiàn)完成后,則可以進行模板導(dǎo)出操作,步驟如下:
A、進入菜單:項目->導(dǎo)出模板

B、彈出:導(dǎo)出模板向?qū)ы撁?/p>

C、設(shè)置模板相關(guān)信息,點擊完成;則模板創(chuàng)建成功

輸出位置為自定義模板導(dǎo)出存儲位置;
【自動將模板導(dǎo)入 Visual Studio】選項,選中后會將項目模板復(fù)制一份,放入到特定的文件夾中,下次建立新項目就可以搜索使用。
4、模板項目添加語言、平臺和項目類型等標簽
前面的步驟已經(jīng)完成對模板的創(chuàng)建,但是在創(chuàng)建項目時,可以根據(jù)項目平臺、語言、項目類型標簽過濾,那么如何實現(xiàn)項目模板標簽?zāi)兀?/p>
接下來對3步驟中生成的項目模板進行研究:
打開模板文件的壓縮文件中發(fā)現(xiàn)了模板文件

解壓文件后,對該文件進行編輯,添加語言標簽(LanguageTag)、平臺標簽(PlatformTag)、項目類型標簽(ProjectTypeTag):
<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
<TemplateData>
<!--項目名稱-->
<Name>ApiTemplate</Name>
<!--項目描述-->
<Description>基礎(chǔ)API模板:支持SwaggerUI、認證、性能監(jiān)控等基礎(chǔ)功能</Description>
<!--項目類型-->
<ProjectType>CSharp</ProjectType>
<ProjectSubType>
</ProjectSubType>
<SortOrder>1000</SortOrder>
<!--指定在實例化項目時是否創(chuàng)建包含文件夾。-->
<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 中可用的以上描述標簽的取值內(nèi)容:
| 語言標簽(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) | 機械學(xué)習(xí) (machinelearning) |
| Visual Basic (visualbasic) | 移動 (mobile) | |
| Office (office) | ||
| 其他 (other) | ||
| 服務(wù) (service) | ||
| 測試 (test) | ||
| UWP (uwp) | ||
| Web (web) |
最后將修改的文件打包成zip壓縮(必須為zip文件)文件后,復(fù)制到項目模板所在位置(%USERPROFILE%\Documents\Visual Studio 2019\Templates\ProjectTemplates)
二、 自定義項目模板使用
前面步驟已完成模板創(chuàng)建,接下來就驗證模板是否生效:
打開vs進入項目創(chuàng)建界面,搜索API,如下:



到此項目設(shè)置的標簽以及代碼中命名空間、注釋都已生效。項目模板效果已實現(xiàn)
三、總結(jié):
所有項目模板和項模板(無論是與 Visual Studio 一起安裝的還是由你創(chuàng)建的)均通過使用相同的原則工作并具有類似的內(nèi)容。所有模板均包含以下項:
使用模板時要創(chuàng)建的文件。這些文件包括源代碼文件、嵌入資源、項目文件等。一個 .vstemplate 文件,其中包含根據(jù)模板創(chuàng)建項目或項以及在“創(chuàng)建新項目”頁面或“添加新項”對話框中顯示模板所需的元數(shù)據(jù)。當這些文件壓縮成 .zip 文件并放在正確的文件夾時,Visual Studio 將自動在以下位置顯示這些文件:在“創(chuàng)建新項目”頁面中顯示項目模板。在“添加新項”窗口中顯示項模板。
項目模板作用非常大,可以將日常積累的功能合并在模板中,可以避免項目開發(fā)中重復(fù)造輪子,提高開發(fā)效率
參考內(nèi)容
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
到此這篇關(guān)于VS2019 自定義項目模板的文章就介紹到這了,更多相關(guān)VS2019 自定義項目模板內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ Go語言實現(xiàn)將windows和linux文件刪除至回收站
這篇文章主要為大家詳細介紹了如何分別使用C++ Go語言實現(xiàn)將windows和linux文件刪除至回收站,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
都2019年了,還問http中GET和POST的區(qū)別
最近看了一些同學(xué)的面經(jīng),發(fā)現(xiàn)無論什么技術(shù)崗位,還是會問到 get 和 post 的區(qū)別,而搜索出來的答案并不能讓我們裝得一手好逼,那就讓我們從 HTTP 報文的角度來擼一波,從而搞明白他們的區(qū)別2019-02-02
Matlab使用Plot函數(shù)實現(xiàn)數(shù)據(jù)動態(tài)顯示方法總結(jié)
這篇文章主要介紹了Matlab使用Plot函數(shù)實現(xiàn)數(shù)據(jù)動態(tài)顯示方法總結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02

