VS 擴展開發:Grpc Proto To Nuget Package

背景

一直以來我們使用 gRPC 來進行微服務開發,對 gRPC 有過了解應該清楚它依賴 proto 接口定義文件來實現的,在進行服務調用之前,需要先通過 proto 文件來生成當前服務使用語言的客戶端代碼,然後就可以實現調用本地方法一樣調用遠程服務。(目前已存在不用生成客戶端代碼就可以調用方法的方式,但與本文的重點不一樣

在 .NET 開發中,我們目前的方式是通過 proto 文件生成客戶端代碼並建成 Nuget Package ,然後推送到自己的私有 Nuget 倉庫,最後在服務內進行 Nuget Package 安裝來引用服務,這樣不至於需要調用此服務的服務每次都 copy 代碼,希望簡化一些工作量。

但問題又來了,要實現推送到自己的私有 Nuget 倉庫的步驟實在太多,這樣依然效率低下,最後決定團隊內決定自己開發一個 VS 插件 Grpc Proto To Nuget Package ,目的是一鍵生成 Nuget Package 併發布到私有倉庫。

實現方案

  1. 創建 Grpc 客戶端項目模板,關於 .NET 項目模板創建可參考文章:ASP.NET 自定義項目模板

  2. 創建 VS 擴展插件 Grpc Proto To Nuget Package

  3. 右鍵選中 protos 文件夾 (proto 接口定義文件存放位置,文件夾名固定爲 protos ),在右鍵菜單中點擊 Grpc Proto To Nuget Package,配置私有 Nuget 倉庫源地址和 API Key,然後會自動創建基於項目模板的臨時項目,同時會把 protos 文件夾複製到臨時項目中,執行生成客戶端代碼命令(注:公共的 proto 文件可放在 protos/common 下,否則都需要放在 protos 文件夾根目錄);

  4. 介於 Grpc 客戶端調用需要對 channel 進行復用,所以同時會基於 T4 模板自動生成複用 channel 的 client 代碼,使在調用時不用考慮 channel 複用問題 ;

  5. 最終通過 dotnet builddotnet nuget push 將客戶端代碼的 Nuget Package 推送到私有倉庫;

  6. 刪除臨時項目。

使用方法

  1. 下載最新 GrpcProtoToNugetPackageTemplate.zip ASP.NET 的項目模板;

  2. 解壓 GrpcProtoToNugetPackageTemplate.zip,在安裝之前最好對以下文件進行必要的修改,主要是團隊相關信息:

    Content/.template.config/template.json: author
    Grpc.Proto.To.Nuget.Package.nuspec: authors
    GrpcProtoToNugetPackage.csproj: Authors、Company、RepositoryUrl,其他看情況修改如:TargetFrameworks .

  3. 執行 nuget pack Grpc.Proto.To.Nuget.Package.nuspec(nuget 如果不存在,需要下載並將 nuget.exe 添加到環境變量) 生成 Grpc.Proto.To.Nuget.Package.1.0.0.nupkg

  4. 執行 dotnet new -i Grpc.Proto.To.Nuget.Package.1.0.0.nupkg 進行模板安裝;

  5. 安裝成功後,可通過 dotnew new -u 進行查看現有的項目模板,如下:Grpc.Proto.To.Nuget.Package 即安裝的項目模板,如果需要卸載,執行 dotnew new -u Grpc.Proto.To.Nuget.Package

  6. 下載最新版 GrpcProtoToNugetPackage.vsix,在關閉所有 VS 窗口下安裝此插件;

  7. 安裝成功後,VS 中打開含 proto 文件的項目(注:proto 文件必須放在 protos 文件夾下);

  8. protos 文件夾右鍵選擇 Grpc Proto To Nuget Package,如下:

  9. 點擊後會彈出配置窗口,設置 Nuget Package 要推送到的 源地址APIKey(只需首次設置)

    可在 https://www.nuget.org 官網註冊賬號,並創建 API Key 進行測試,不過這樣是推送的公共平臺上。

  10. 輸入 Nuget Package 版本號(目前需要手動輸入)

    執行過程中使用的資源文件會暫存到 C:\TempGrpcNuget 目錄下。首次會創建 repository.json 保存 Nuget 倉庫的配置信息,接下來每次會根據包名創建一個臨時項目用於生成對應 Nuget Package,如果有問題,一般是因不符合規範導致編譯不通過,這時候可在臨時項目中通過 dotnet build 進行編譯或通過 VS 添加現有項目查看具體問題。

  11. 執行,注意執行結果內的輸出日誌,確保推送到遠端倉庫 OK

  12. Nuget Package 安裝與使用

    static void Main(string[] args)
    {
        // client 集合
        var clientContainer = new ClientContainer("127.0.0.1:1234");
    
        // GreeterClient,如果有多個 Client,也是直接從 clientContainer 中獲取
        var greeterClient = clientContainer.GreeterClient;
    
        var response = greeterClient.SayHello(new HelloRequest
        {
            Name = "BeckJin"
        });
    
        Console.WriteLine(response.Message);
    }
    

總結

以上主要是實現方案及使用方法的具體說明,實際使用 Grpc Proto To Nuget Package 只需如下 3 步:

  1. 安裝 GrpcProtoToNugetPackageTemplate 項目模板;
  2. 安裝 Grpc Proto To Nuget Package VS 插件;
  3. 配置私有 Nuget 倉庫;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章