Nx constructor personalizado asp.net núcleo nodejs

Empecé a utilizar los monorepos Nx para gestionar mis proyectos de reactjs pero me gusta usar un backend de núcleo asp.net. Lo que me gustaría hacer es crear un constructor personalizado para ejecutar mi comando dotnet reloj run en un ejecutante personalizado\builder y ejecutar no el servidor webpack sino un servidor dotnet. Así que intento ejecutar el dotnet cli de nodejs. Hice un app.js para probar e intentar correr:

const { spawn } = require("child_process");
const fs = require("fs");

const out = fs.openSync("./out.log", "a");
const err = fs.openSync("./out.log", "a");

const subprocess = spawn("dotnet", ["run", "--project", "./apps/asp-web"], {
  detached: true,
  stdio: ["pipe", out, err],
});
subprocess.unref();
   

Esto parece funcionar pero no parece ser capaz de correr dentro de la consola activa de nodos así detached:false y también no puedo encontrar una manera de ejecutar el comando dotnet watch run --project ./apps/asp-web¿Hay una mejor solución para hacer esto?

Pregunta hecha hace 3 años, 4 meses, 29 días - Por techinnovator


2 Respuestas:

  • Para ejecutar el comando dotnet watch run --project ./apps/asp-web desde un script de Node.js, puedes usar la biblioteca cross-spawn que te permitirá ejecutar comandos de forma más sencilla y flexible. Aquí te muestro cómo podrías modificar tu código para lograrlo:

    • Primero, instala la biblioteca `cross-spawn` si aún no lo has hecho. Para instalarla, puedes usar npm:
    bash
    npm install cross-spawn
    
    • Luego, modifica tu script de Node.js para usar `cross-spawn`:

    ```javascript const crossSpawn = require('cross-spawn');

    const subprocess = crossSpawn('dotnet', ['watch', 'run', '--project', './apps/asp-web'], { stdio: 'inherit', });

    subprocess.on('close', (code) => { if (code !== 0) { console.error(Error al ejecutar el comando. Código de salida: ${code}); } }); ```

    En este caso, he utilizado stdio: 'inherit' para que la entrada y salida estándar del proceso hijo se dirijan a la consola activa. También he añadido una verificación para manejar el código de salida del proceso.

    Al ejecutar este script, debería arrancar el comando dotnet watch run --project ./apps/asp-web en la misma consola activa y mostrar la salida en ella.

    Espero que esta solución sea de utilidad. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 17, 2020 a las 17:49 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Uso de un constructor personalizado en Nx para ejecutar comandos de dotnet

    Para crear un constructor personalizado en Nx para ejecutar comandos de dotnet:

    • Crea un archivo `custom-executor.js` en el directorio `executors` de tu proyecto Nx. Por ejemplo:
    bash
    mkdir -p projects/my-project/executors
    touch projects/my-project/executors/custom-executor.js
    
    • Implementa la interfaz `Executor` en tu archivo `custom-executor.js`. La interfaz `Executor` requiere un método `execute` que devuelve una promesa que se resuelve con el resultado de la ejecución o se rechaza con un error.
    • En el método `execute`, ejecuta tu comando de dotnet utilizando la función `spawn` de Node.js. Por ejemplo:
    js
    const { spawn } = require('child_process');
    
    async function execute() {
      try {
        const subprocess = spawn('dotnet', ['run', '--project', './apps/asp-web'], {
          stdio: 'inherit',
        });
    
        subprocess.on('exit', (code) => {
          if (code === 0) {
            console.log('dotnet process completed successfully');
          } else {
            console.error('dotnet process failed');
          }
        });
    
        await new Promise((resolve, reject) => {
          subprocess.on('close', (code) => {
            if (code === 0) {
              resolve();
            } else {
              reject(new Error('dotnet process failed'));
            }
          });
        });
      } catch (error) {
        console.error('Error executing dotnet command:', error);
        throw error;
      }
    }
    
    • Registra tu constructor personalizado en el archivo `workspace.json` de tu proyecto Nx. Por ejemplo:
    json
    {
      "executors": {
        "custom-executor": {
          "builder": "./executors/custom-executor.js",
          "schema": "./executors/custom-executor.schema.json"
        }
      }
    }
    
    • Utiliza tu constructor personalizado en un script de compilación. Por ejemplo, puedes crear un script de compilación llamado `build-dotnet` que utilice tu constructor personalizado:
    bash
    // build-dotnet.js
    const exec = require('@nrwl/workspace/src/utilities/exec');
    
    exec.runExecutor('custom-executor', {});
    

    Ejecución de dotnet watch run

    Para ejecutar el comando dotnet watch run, puedes utilizar la siguiente estrategia:

    • Crea un script de compilación personalizado que llame al comando `dotnet watch run` usando la función `spawn` de Node.js.
    • Registra este script de compilación personalizado en el archivo `workspace.json`.
    • Utiliza este script de compilación personalizado en tu script de compilación de Nx.

    Ejemplo de script de compilación personalizado para dotnet watch run:

    js
    const { spawn } = require('child_process');
    
    async function execute() {
      try {
        const subprocess = spawn('dotnet', ['watch', 'run', '--project', './apps/asp-web'], {
          stdio: 'inherit',
        });
    
        subprocess.on('exit', (code) => {
          if (code === 0) {
            console.log('dotnet watch run completed successfully');
          } else {
            console.error('dotnet watch run failed');
          }
        });
    
        await new Promise((resolve, reject) => {
          subprocess.on('close', (code) => {
            if (code === 0) {
              resolve();
            } else {
              reject(new Error('dotnet watch run failed'));
            }
          });
        });
      } catch (error) {
        console.error('Error executing dotnet command:', error);
        throw error;
      }
    }
    

    Nota: Ten en cuenta que estas son solo directrices generales y es posible que necesites ajustar la implementación según tus requisitos específicos.

    Respondida el Dec 17, 2020 a las 17:58 - por Gemini

    Votos positivos: 0 | Votos negativos: 0