es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Aplicación C# con salida coloreada al ejecutarse desde los ganchos de git.

Necesito mostrar salidas de color en una aplicación de consola cuando se ejecuta desde ganchos de git como (pre-commit, etc.). Este es un problema en uno de mis proyectos de código abierto que puedes revisar aquí.

Supongamos que tenemos una aplicación de consola con este código:

Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine("Hello World");

La salida es blanca cuando la ejecutamos desde ganchos de git.

También intenté usar códigos de escape VT100 y secuencias de terminal virtual de consola habilitando secuencias de terminal virtual, pero tuve los mismos resultados.

// HABILITAR PROCESAMIENTO DE TERMINAL VIRTUAL...

// establecer color vt100
public static void SetForegroundColor(int r, int g, int b)
{
   Console.Write($"\x1b[38;2;{r};{g};{b}m");
}

Por ejemplo, pre-commit:

#!/bin/sh

ejecutar la aplicación.

husky run

Cualquier información que pueda ayudarme a encontrar qué está causando esto es apreciada. El problema es que aún no estoy seguro de dónde buscar, ¿es un problema específico de git? ¿Un problema de scripting de shell o un problema de C#?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para mostrar salidas de colores en una aplicación de consola cuando se ejecuta desde ganchos de Git, es posible que desee probar lo siguiente:

    1. Asegúrese de que su aplicación de consola establezca el color de primer plano utilizando Console.ForegroundColor antes de imprimir cualquier cosa en la consola.
    2. Intente habilitar secuencias de terminal virtual de consola llamando a SetConsoleMode con la bandera ENABLE_VIRTUAL_TERMINAL_PROCESSING. Esto le permitirá utilizar códigos de escape VT100 para establecer el color de primer plano. Aquí hay un ejemplo:

      const int ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004;
      SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), ENABLE_VIRTUAL_TERMINAL_PROCESSING);
      
      public static void SetForegroundColor(int r, int g, int b)
      {
         Console.Write($"\x1b[38;2;{r};{g};{b}m");
      }
      

      Tenga en cuenta que SetConsoleMode y GetStdHandle son funciones API de Win32 definidas en la biblioteca kernel32.dll. Deberá importarlas utilizando el atributo DllImportAttribute:

      [DllImport("kernel32.dll", SetLastError = true)]
      static extern bool SetConsoleMode(IntPtr hConsoleHandle, int mode);
      
      [DllImport("kernel32.dll", SetLastError = true)]
      static extern IntPtr GetStdHandle(int nStdHandle);
      
      const int STD_OUTPUT_HANDLE = -11;
      

    3. Si ninguno de los métodos anteriores funciona, es posible que desee revisar sus ganchos de Git y asegurarse de que no estén interfiriendo con la aplicación de consola. Por ejemplo, si su script de shell está redirigiendo la salida de la aplicación de consola a un archivo o un tubo, esto puede afectar la salida de color. Intente ejecutar la aplicación de consola directamente sin el gancho de Git y vea si la salida de color funciona como se esperaba.

    4. Por último, vale la pena señalar que no todos los emuladores de consola admiten secuencias de terminal virtual y, incluso si lo hacen, el comportamiento puede diferir entre emuladores. Si está ejecutando su aplicación de consola en una plataforma diferente, asegúrese de probarla en una variedad de emuladores para asegurarse de que la salida de color funcione como se esperaba.

Comments are closed.