前言:
使用“宇宙最強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