開發現代化的.NetCore控制檯程式:(2)建立一個C#專案模板

程式設計實驗室發表於2023-11-10

前言

上一篇文章(開發一個現代化的.NetCore控制檯程式,包含依賴注入/配置/日誌等要素)介紹了開發現代化的.NetCore控制檯程式的細節,但這還不夠,我又建立了一個腳手架模板,並命名為 FluentConsole.Templates ,可以方便的建立「現代化控制檯應用」。

原始碼地址: https://github.com/Deali-Axy/fluent-dotnet-console

Nuget包地址: https://www.nuget.org/packages/FluentConsole.Templates/

模板功能

  • ? 提供快速開發模板,一鍵生成控制檯應用的專案骨架
  • ? 提供一個「現代化控制檯應用專案結構的最佳實踐」的參考方案
  • ? 依賴注入 - 基於 Microsoft.Extensions.DependencyInjection 的依賴注入支援
  • ? 日誌 - 基於 Microsoft.Extensions.Logging 日誌框架,搭配 Serilog 實現日誌檔案輸出
  • ? 配置 - 基於 Microsoft.Extensions.Configuration 配置框架,搭配 dotenv.net 等元件擴充套件功能

快速開始

安裝模板

dotnet new install FluentConsole.Templates

使用模板建立專案

dotnet new flu-cli -n MyProject

專案目錄結構

使用模板建立的專案目錄結構是這樣,程式碼統一放在 src 目錄下。

MyProject
 ├─ src
 │  ├─ Utilities
 │  │  └─ ConsoleTool.cs
 │  ├─ Services
 │  │  ├─ MainService.cs
 │  │  └─ IService.cs
 │  ├─ MISC
 │  │  └─ SourceGenerationContext.cs
 │  ├─ Entities
 │  │  ├─ OutputResult.cs
 │  │  └─ AppSettings.cs
 │  └─ Program.cs
 ├─ MyProject.csproj
 ├─ Dockerfile
 └─ appsettings.json

這是 src 裡每個目錄的介紹:

  • Utilities - 存放通用工具類
  • Services - 業務邏輯程式碼
  • MISC - 雜項
  • Entities - 實體類,強型別配置、輸出結果物件

因此,建立專案之後,直接在 Services/MainService.cs 檔案裡寫業務邏輯就好了。

如何建立專案模板?

跟著微軟官方的教程來,非常容易,主要是一些目錄結構方面的細節需要處理一下。

以本專案的原始碼為例,我們需要一個建立模板的工作目錄,這個目錄在本專案中是 src/Templates

Templates
 ├─ content
 │  └─ FluentConsole.Template
 │     ├─ FluentConsole.Template
 │     │  ├─ src
 │     │  ├─ FluentConsole.Template.csproj
 │     │  ├─ Dockerfile
 │     │  ├─ appsettings.json
 │     │  └─ .env
 │     └─ .template.config
 │        └─ template.json
 └─ FluentConsole.Templates.csproj

然後把所有模板放在 content 目錄中,可以理解為 content 目錄下面每個目錄都是一個模板,當然本專案只建立了一個模板,也許以後會新增更多的模板。

每個模板下面最重要的就是 .template.config ,有了這個目錄,dotnet 才會識別到這是個模板

當然還得寫個模板配置 template.json

{
  "$schema": "http://json.schemastore.org/template",
  "author": "DealiAxy",
  "classifications": [
    "Common",
    "Console"
  ],
  "identity": "FluentConsole.Template",
  "name": "FluentConsole.Template",
  "description": "提供「現代化的控制檯應用的開發體驗」腳手架,能像 Web 應用那樣很優雅地整合各種元件,包括依賴注入、配置、日誌等功能。",
  "shortName": "flu-cli",
  "sourceName": "FluentConsole.Template",
  "tags": {
    "language": "C#",
    "type": "project"
  }
}

注意其中的 sourceName 欄位,這是模板建立時會被替換的內容。

比如我們使用了以下命令,從模板建立一個專案,透過 -n 指定了專案名稱為 MyProject

dotnet new flu-cli -n MyProject

那麼 dotnet 會自動把 sourceName 設定的這個名字替換為使用者指定的專案名稱 MyProject

OK,暫時就是這些了,建立模板就這麼簡單。

安裝模板

可以直接從原始碼安裝模板

依然是這個專案程式碼,切換到模板程式碼所在的目錄下面,即可安裝模板

cd src/Templates/content/FluentConsole.Template
dotnet new install ./

安裝後可以看到安裝成功的提示

成功: FluentConsole.Templates::1.1.0 已安裝以下模板:
----------------------  -------  ----  --------------
FluentConsole.Template  flu-cli  [C#]  Common/Console

建立 nuget 包

src/Templates 下建立 FluentConsole.Templates.csproj 檔案

關鍵程式碼如下

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <PackageId>FluentConsole.Templates</PackageId>
    <PackageVersion>1.1</PackageVersion>
    <Title>FluentDotnetConsole Templates</Title>
    <Authors>DealiAxy</Authors>
    <Company>CodeLab</Company>
    <Description>提供「現代化的控制檯應用的開發體驗」腳手架,能像 Web 應用那樣很優雅地整合各種元件,包括依賴注入、配置、日誌等功能。</Description>
    <PackageTags>dotnet-new;templates;console;cli</PackageTags>
    <PackageProjectUrl>https://github.com/Deali-Axy/fluent-dotnet-console</PackageProjectUrl>

    <PackageType>Template</PackageType>
    <TargetFramework>netstandard2.0</TargetFramework>
    <IncludeContentInPack>true</IncludeContentInPack>
    <IncludeBuildOutput>false</IncludeBuildOutput>
    <ContentTargetFolders>content</ContentTargetFolders>
    <NoWarn>$(NoWarn);NU5128</NoWarn>
    <NoDefaultExcludes>true</NoDefaultExcludes>
    <PackageReadmeFile>README.md</PackageReadmeFile>
  </PropertyGroup>

  <ItemGroup>
    <Content Include="content\**\*" Exclude="content\**\bin\**;content\**\obj\**"/>
    <Compile Remove="**\*"/>
  </ItemGroup>
</Project>

然後執行 dotnet pack 即可建立 nuget 包

然後可以上傳到 nuget 平臺。

使用 GitHub 釋出 nuget 包

GitHub 提供了 Packages 管理的功能,可以直接從 GitHub 專案直接建立 nuget 包,併發布到 nuget 平臺。

PS:我研究一下,下一篇文章再繼續介紹。

參考資料

相關文章