c#: compartir un archivo de protocolo gRPC para todas las soluciones

CorePress2024-01-25  354

Recientemente tuve en mis manos gRPC en .net core y hasta ahora estoy muy satisfecho con él.

El único problema que tengo son los archivos proto, por ejemplo: si hago un cambio en el archivo MyProtos.proto en mi solución de servidor grpc. Tendré que actualizar los archivos MyProtos.proto en todas mis soluciones cliente.

Entonces me preguntaba si hay formas de compartir los archivos proto.

Intenté crear una solución separada y colocar los archivos proto allí y luego hacer referencia a todas las demás soluciones, pero no pude hacerlo funcionar.



------------------------------------

Puedes distribuir archivos proto con el paquete nuget. Utilice el archivo .nuspec para empaquetar elarchivos. Por ejemplo, si sus archivos *.proto están en la carpeta proto, My.Server.Proto.nuspec puede verse así:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
  <metadata>
    <id>My.Server.Proto</id>
    <version>1.0.0</version>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>My Server Proto Files</description>
    <authors>My Company Ltd.</authors>
  </metadata>
  <files>
    <file src="proto/**/*.proto" />
  </files>
</package>

Luego, en el proyecto donde desea consumir los archivos, instale las dependencias de grpc

<ItemGroup>
  <PackageReference Include="Google.Protobuf" Version="3.14.0" />
  <PackageReference Include="Grpc.Tools" Version="2.34.0">
    <PrivateAssets>all</PrivateAssets>
    <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
  </PackageReference>
</ItemGroup>

Instala tu paquete proto:

<ItemGroup>
  <PackageReference Include="My.Server.Proto" Version="1.0.0" GeneratePathProperty="true" />
</ItemGroup>

Tenga en cuenta GeneratePathProperty="true". Esto le permitirá consultar la carpeta de instalación de Nuget. Ahora agregue elementos de Protobuf

<ItemGroup>
  <Protobuf Include="$(PkgMy_Server_Proto)/proto/**/*.proto" ProtoRoot="$(PkgMy_Server_Proto)" GrpcServices="Client" />
</ItemGroup>

La variable $(PkgMy_Server_Proto) se resolverá en la carpeta nuget My.Server.Proto. El nombre de la variable comienza con Pkg y va seguido del nombre del paquete cuando . se reemplaza por _.

2

1

Ty, probará esta solución y te lo haré saber, Arthur. ¡Gracias!

– Asım Gündüz

29 de marzo de 2021 a las 4:42

1

He intentado hacer algo similar pero he tenido problemas con errores falsos de IntelliSense. Esta respuesta me ayudó a crear una solución que no sufre ese problema. He creado un proyecto de demostración autónomo utilizando este enfoque.

- Martin Liversage

15 dic 2021 a las 12:21



------------------------------------

El uso de Servicios conectados puede configurar fácilmente la referencia de proto de otros proyectos y puede eliminar el enlace en el archivo del proyecto. Sin embargo, esto sólo puede hacer referencia al proto del archivo local, no al proto del proyecto. Por supuesto, no hay nada para el camino relativo de la misma solución, la diferencia También puedes citar directamente así, los dos tienen el mismo efecto

<ItemGroup>
  <Protobuf Include="..\Shared\Protos\greet.proto" GrpcServices="Server"/>
</ItemGroup>



------------------------------------

El libro "Inicio de gRPC con ASP.NET Core6", capítulo 7, describe cómo crear una única fuente de archivos .proto, dentro de una única solución. La conclusión es que en proyectos que utilizan una fuente de archivos .proto, debe agregar al archivo .csproj un enlace al proyecto fuente de archivos .proto.

A continuación se muestra un ejemplo de creación de una solución de microservicio desde cero con un cliente gRPC y tres servicios gRPC:

Preparemos la solución:
md MicroservicesExample
cd MicroservicesExample
dotnet new create grpc -n GrpcClient -o GrpcClient -lang C# --no-restore
dotnet new create grpc -n GrpcService1 -o GrpcService1 -lang C# --no-restore
dotnet new create grpc -n GrpcService2 -o GrpcService2 -lang C# --no-restore
dotnet new create grpc -n GrpcService3 -o GrpcService3 -lang C# --no-restore
dotnet new sln -n MicroservicesExample -o ./
dotnet sln MicroservicesExample.sln add GrpcClient
dotnet sln MicroservicesExample.sln add GrpcService1
dotnet sln MicroservicesExample.sln add GrpcService2
dotnet sln MicroservicesExample.sln add GrpcService3
Eliminemos el directorio Protos de todos los proyectos excepto GrpcService1, porque será nuestra fuente de archivos .protos:
rmdir /s /q "./GrpcClient/Protos"
rmdir /s /q "./GrpcService2/Protos"
rmdir /s /q "./GrpcService3/Protos"
A continuación, manualmente, usando el editor de bloc de notas, edite secuencialmente cada uno de los archivos del proyecto (no olvide guardar los cambios Ctrl+S):
notepad "./GrpcClient/GrpcClient.csproj"
notepad "./GrpcService2/GrpcService2.csproj"
notepad "./GrpcService3/GrpcService3.csproj"

a) elimine las siguientes tres líneas:

<ItemGroup>
  <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>

b) y agregue las siguientes líneas en lugar delíneas eliminadas:

<ItemGroup>
  <Protobuf Include="..\GrpcService1\Protos\greet.proto" GrpcServices="Server">
    <Link>Protos\greet.proto</Link>
  </Protobuf>
</ItemGroup>
Luego, también manualmente, editamos cada uno de los servicios en cada uno de los proyectos:
notepad "./GrpcClient/Services/GreeterService.cs"
notepad "./GrpcService2/Services/GreeterService.cs"
notepad "./GrpcService3/Services/GreeterService.cs"

al inicio de cada servicio agregamos:

using GrpcService1;
Al final, inicie Visual Studio, abra la solución MicroservicesExample.sln y ejecútela. Si todo se hace correctamente, la solución se compilará y ejecutará correctamente con una única fuente de archivos .protos.

En la captura de pantalla puedes ver el resultado, donde puedes ver que todos los proyectos hacen referencia a la misma fuente de archivos .proto:

1

CreoLa pregunta era sobre múltiples soluciones. Como se señaló en una de las respuestas anteriores, NuGet podría ser una de las opciones.

-soshman

8 de diciembre de 2023 a las 14:16

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare