Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

18 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 8 de octubre de 2019
gRPC Como un servidor, todos los que tengáis la inmensa fortuna de utilizar en Windows un nombre de usuario con espacios o caracteres especiales como "José María Aguilar", seguro que habéis encontrado alguna vez problemas con aplicaciones o herramientas que fallan cuando intentan acceder a contenidos de la carpeta C:\Users\<Tu nombre>:

Username chungo en Windows

De hecho, llevo ya varios encontronazos de este tipo en los últimos meses (por ejemplo, con Anaconda o con el SDK de Android para Windows), y el último lo he tenido al intentar utilizar las herramientas de Protobuf para la creación de servicios gRPC que, como sabéis, es una de las novedades incluidas en .NET Core 3.

Aunque el problema lo he encontrado trabajando con Visual Studio, ciertamente este IDE tiene poco que decir al respecto; ocurre lo mismo usando línea de comandos o cualquier otro entorno que se base en el tooling oficial de gRPC para .NET.

El problema

El problema es bastante sencillo de reproducir si usáis nombres de usuario de ese tipo. Basta con crear un proyecto de tipo "Servicio gRPC" e intentar compilarlo. Si lo hacemos desde Visual Studio, veremos el siguiente error:

Error 'protoc-gen-grpc: el sistema no puede encontrar la ruta especificada

Y si lo hacemos desde línea de comandos, no mejora mucho la cosa:
C:\test>dotnet new grpc
The template "ASP.NET Core gRPC Service" was created successfully.

Processing post-creation actions...
Running 'dotnet restore' on C:\test\test.csproj...
  Restauración realizada en 96,36 ms para C:\test\test.csproj.

Restore succeeded.


C:\test>dotnet build
Microsoft (R) Build Engine versión 16.3.0+0f4c62fea para .NET Core
Copyright (C) Microsoft Corporation. Todos los derechos reservados.

  Restauración realizada en 19,26 ms para C:\test\test.csproj.
--grpc_out : error : protoc-gen-grpc: El sistema no puede encontrar 
la ruta especificada. [C:\test\test.csproj]

ERROR al compilar.

--grpc_out : error : protoc-gen-grpc: El sistema no puede encontrar 
la ruta especificada. [C:\test\test.csproj]
    0 Advertencia(s)
    1 Errores

Tiempo transcurrido 00:00:00.68

C:\test>_
Me encantan estos errores que no dan pistas sobre el origen del problema ;)

La solución

Desde luego, y me lo apunto para mi próxima instalación de Windows, el mejor remedio sería no utilizar un nombre de usuario con espacios ni caracteres extraños. Un "jmaguilar" habría sido perfecto, ho hay necesidad de utilizar el nombre completo ;)
C:\Users\José María Aguilar> _
Pero si ya estamos en un momento en que esto no tiene solución sencilla, podéis seguir los pasos descritos a continuación:

1. Crear un enlace simbólico, o un junction link, por ejemplo en la raíz del disco duro, apuntando hacia el directorio donde se encuentra la carpeta packages de NuGet:
C:\> mklink /j "C:\.nuget" "C:\Users\José María Aguilar\.nuget"
Una vez ejecutado este comando, la carpeta se verá en el explorador de archivos como se muestra en la siguiente captura de pantalla:

  Junction link creado en la carpeta raíz

2. Establecer la variable de entorno NUGET_PACKAGES, que indica la ubicación de la carpeta Packages de NuGet, utilizando el enlace simbólico. En mi caso, es algo como:
NUGET_PACKAGES=C:\.nuget\packages
¡Y esto es todo! Espero que os resulte útil, y recordad que este mismo truco podéis usarlo para otros escenarios en los que ocurra lo mismo :)

Publicado en: Variable not found.

1 comentario:

Valentín dijo...

Añadir que he tenido el mismo problema porque en mi nombre de usuario de Windows hay una tilde. También decir que la solución propuesta en el post también ha resuelto mi problema.