gRPC development on .NET Core - Integration into .NET Build(.csproj)


介紹如何將 gRPC 整合至 .NET Core 的專案檔(.csproj) 內.

延續先前兩篇 gRPC 應用程式 - 基礎入門gRPC 的 GUI 工具 - BloomRPC 協助 .NET Core 開發 gRPC 應用程式的整合測試 後,這篇要介紹一下Grpc.Tools 1.17.0 之後整合 .csproj 的開發方式如何更加輕鬆地進行 gRPC 的開發.

以下內容是延續 gRPC 應用程式 - 基礎入門 做分享,建議先看此篇後再往下閱讀.

範例程式碼:blackie1019/demo-grpc-dotnet-build-integration

專案結構

所以我們先產生了與之前雷同的目錄與內容:

/
├── Demo.sln
├── protos/
│   ├── message.cs
│   ├── service.cs
├── src/
│   ├── Demo.Clinet/
│   ├── Demo.Server/
│   ├── Demo.Message/

與先前不同的是本次直接將 gRPC 的開發整合進入 Demo.Message.csproj:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Google.Protobuf" Version="3.7.0" />
        <PackageReference Include="Grpc" Version="1.19.0" />
        <PackageReference Include="Grpc.Tools" Version="1.19.0" PrivateAssets="All" />
    </ItemGroup>
    
    <ItemGroup>
        <!-- Explicitly include our helloworld.proto file by adding this line: -->
        <Protobuf Include="../../protos/Common/*.proto" ProtoRoot="../../protos" OutputDir="%(RelativePath)" CompileOutputs="False" GrpcServices="None" />
        <Protobuf Include="../../protos/App/*.proto" ProtoRoot="../../protos" OutputDir="%(RelativePath)" CompileOutputs="False" GrpcService="both" />
    </ItemGroup>

</Project>

另外,本次專案這邊額外定義了一個通用類別於 Common 目錄下,並於使用到該類型的 .proto 載入此檔案(路徑需包含 subfolder).

而 Grpc.Tools 設定了 PrivateAssets="All" ,該屬性指定應取用哪些資產不會放入下一個專案的套件,阻止下一個引用該專案產生的 .dll 時 .csproj 的 .dll 引用繼承。

細節可參考Package references (PackageReference) in project files

只要設定此步驟即可完成編譯,而這邊我們選擇 CompileOutputs 為 False 則需要手動IDE編譯:

01

如果編譯有問題的朋友建議可以進入專案目錄下透過 dotnet build 編譯產出時查看細部編譯執行紀錄:

02

當將 Server 與 Client 兩者運行即可看到以下畫面:

03

透過 Grpc.Tools 1.17.0 與 .csproj 的直接整合,即可加入原先手動執行 protoc 的麻煩與人為錯誤的可能,加速 gRPC 於 .NET 上的開發效率.

References


作者: Blackie
版權聲明: 本站所有文章除特別聲明外,均採用 CC BY 4.0 許可協議。轉載請註明來源 Blackie !
  目錄