Cómo suprimir la salida al ejecutar scripts npm

93

He decidido experimentar con scripts npm como herramienta de compilación y hasta ahora me gusta. Un problema que me gustaría resolver es que cuando ejecuto un script para ejecutar jshint cuando algo no pasa, obtengo un montón de "npm ERR!" líneas. Me gustaría suprimirlos ya que la salida del linter es más significativa.

¿Existe una buena manera de configurar esto globalmente y hay alguna manera de configurarlo para cada ejecución de script?


fuente
Hay un problema sobre este mismo tema en: github.com/npm/npm/issues/6124
daotoad

Respuestas:

159

Todos los guiones:

Puede solucionar esto suprimiendo la salida de npm en general, estableciendo el nivel de registro silenten de dos formas:

En cada npm runinvocación:

npm run --silent <your-script>

O globalmente creando un .npmrcarchivo (este archivo puede estar en el directorio de su proyecto o en su carpeta de inicio) con lo siguiente:

loglevel=silent

Recursos:

Configuración de nivel de registro npm: https://docs.npmjs.com/misc/config#loglevel

npmrc: https://docs.npmjs.com/misc/config#loglevel

Cada guión, individualmente:

Un truco simple que he usado para solucionar este problema en ciertos scripts como linting es agregarlos || trueal final de dichos scripts. Esto funcionará sin ningún cambio de configuración de npm.

Esto asegurará que el script siempre saldrá con un 0estado. Esto engaña a npm para que piense que el script tiene éxito y, por lo tanto, oculta los ERRmensajes. Si desea ser más explícito, puede agregar en su || exit 0lugar y debería lograr el mismo resultado.

{
  "scripts": {
    "lint": "jshint || true",
   }
}
Sanketh Katta
fuente
|| true no funciona si está intentando agregar argumentos al final de la ejecución de npm, por ejemplo. npm ejecutar myCmd - --deploy
arcseldon
4
Esto es realmente bastante absurdo (no te culpo). No quiero agregar || true; esa no es una buena solución. No quiero silenciar TODOS los demás comandos que usan .npmrc. Y ejecutar este script en particular -stodo el tiempo también parece muy tonto. ¿Alguien encontró una mejor solución para silenciar un solo script?
PascalVKooten
En caso de que alguien más se encuentre con esto, hay un problema abierto: consulte github.com/npm/npm/issues/8821 .
Ian Routledge
loglevel = silent me parece una exageración. Eso silenciaría incluso los mensajes de error (aunque aún se escribirían en un archivo local). Según el enlace que aparece poco después de esta sugerencia, los niveles de registro posibles, en orden de prioridad, son: "silencioso", "error", "advertencia", "aviso", "http", "tiempo", "información", "detallado "," tonto ". Sugeriría "error" (que suprimiría las advertencias, pero mostraría errores) o "advertir" (que incluiría advertencias). Normalmente, npm no tiene por qué mostrarnos cómo decide qué ejecutar, que es lo que hace de forma predeterminada. Eso se siente como depurar texto.
John Deighan
De acuerdo, necesito corregirme y presentar una objeción. ¿Quizás es incluso un error de node.js? Cuando creé un archivo .npmrc con 'loglevel = error', la ejecución de 'npm test' aún se rastreaba a través de la lógica de npm sobre cómo determinaba qué línea de comando ejecutar. Nodo versión 8.12.0, npm versión 5.8.0.
John Deighan
44

Debería poder utilizar las opciones --quiety --silent, como en

npm install --quiet

--quietmostrará stderr y advertencias, --silentdebería suprimir casi todo

También puede enviar stdout / stderr a /dev/null, así:

npm install > "/dev/null" 2>&1

o menos versbose

npm install &> /dev/null
Alexander Mills
fuente
7
En Windows, es npm install --quiet> NUL
Manohar Reddy Poreddy
4
Esta pregunta trata específicamente sobre la ejecución de scripts npm .
hackel
7
npm install --quiet --no-progress 

Mantendrá advertencias y errores, y suprimirá la barra de progreso de TDAH en terminales que lo admitan.

Michael Cole
fuente
3
Esta pregunta trata específicamente sobre la ejecución de scripts npm .
hackel
1

Puede hacer esto dentro de su secuencia de comandos eliminando los detectores de eventos

#!/usr/bin/env node

process.removeAllListeners('warning');

// Do your thang without triggering warnings
ErisDS
fuente