介紹如何將 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編譯:
如果編譯有問題的朋友建議可以進入專案目錄下透過 dotnet build
編譯產出時查看細部編譯執行紀錄:
當將 Server 與 Client 兩者運行即可看到以下畫面:
透過 Grpc.Tools 1.17.0
與 .csproj 的直接整合,即可加入原先手動執行 protoc 的麻煩與人為錯誤的可能,加速 gRPC 於 .NET 上的開發效率.