Jak pomijać dane wyjściowe podczas uruchamiania skryptów npm

93

Zdecydowałem się poeksperymentować ze skryptami npm jako narzędziem do budowania i póki co mi się podoba. Jednym z problemów, które chciałbym rozwiązać, jest to, że podczas uruchamiania skryptu uruchamiającego jshint, gdy coś nie przechodzi lintingu, otrzymuję mnóstwo komunikatów „npm ERR!” linie. Chciałbym je wyeliminować, ponieważ dane wyjściowe z lintera są bardziej znaczące.

Czy istnieje dobry sposób, aby ustawić to globalnie i czy istnieje sposób, aby ustawić to dla każdego uruchomienia skryptu?


źródło
Jest problem związany z tym tematem pod adresem: github.com/npm/npm/issues/6124
daotoad

Odpowiedzi:

159

Wszystkie skrypty:

Możesz to naprawić, wyłączając generalnie wyjście npm, ustawiając poziom dziennika na silentna kilka sposobów:

Przy każdym npm runwywołaniu:

npm run --silent <your-script>

Lub globalnie, tworząc .npmrcplik (ten plik może znajdować się w katalogu projektu lub w katalogu domowym) z następującymi elementami:

loglevel=silent

Zasoby:

Konfiguracja na poziomie dziennika npm: https://docs.npmjs.com/misc/config#loglevel

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

Każdy scenariusz indywidualnie:

Prostą sztuczką, której użyłem, aby obejść ten problem w niektórych skryptach, takich jak linting, jest dołączenie || truena końcu takich skryptów. To zadziała bez żadnych zmian w konfiguracji npm.

Zapewni to, że skrypt zawsze zakończy pracę ze 0statusem. To nakłania npm do myślenia, że ​​skrypt się powiódł, a tym samym ukrywa ERRwiadomości. Jeśli chcesz być bardziej wyraźny, możesz || exit 0zamiast tego dołączyć i powinno to osiągnąć ten sam wynik.

{
  "scripts": {
    "lint": "jshint || true",
   }
}
Sanketh Katta
źródło
|| true nie działa, jeśli próbujesz dołączyć argumenty na końcu przebiegu npm - np. npm uruchom myCmd - --deploy
arcseldon
4
To naprawdę absurdalne (nie obwiniam cię). Nie chcę dołączać || true; to nie jest dobre rozwiązanie. Nie chcę wyciszać WSZYSTKICH innych poleceń używających .npmrc. Uruchamianie tego konkretnego skryptu przez -scały czas również wydaje się bardzo głupie. Czy ktoś znalazł lepsze rozwiązanie na wyciszenie pojedynczego skryptu?
PascalVKooten
Na wypadek, gdyby ktokolwiek inny się z tym spotkał , istnieje otwarty problem - patrz github.com/npm/npm/issues/8821 .
Ian Routledge
loglevel = silent wydaje mi się przesadą. To wyciszyłoby nawet komunikaty o błędach (chociaż nadal byłyby zapisywane w pliku lokalnym). Zgodnie z linkiem wkrótce po tej sugestii, możliwe poziomy rejestrowania w kolejności priorytetów to: „cichy”, „błąd”, „ostrzeżenie”, „powiadomienie”, „http”, „czas”, „informacje”, „szczegółowe ", "głupi". Sugerowałbym albo „błąd” (który pomijałby ostrzeżenia, ale wyświetlałby błędy) lub „ostrzeżenie” (który obejmowałby ostrzeżenia). Zwykle nie ma powodu, aby npm pokazywał nam, jak decyduje o tym, co ma uruchomić, co robi domyślnie. To przypomina debugowanie tekstu.
John Deighan,
OK, muszę się poprawić i zgłosić sprzeciw. Może to nawet błąd node.js? Kiedy utworzyłem plik .npmrc z parametrem „loglevel = error”, uruchomiłem „test npm” i nadal śledziłem logikę npm dotyczącą tego, w jaki sposób określił, którą linię poleceń uruchomić. Węzeł w wersji 8.12.0, npm w wersji 5.8.0.
John Deighan,
44

Powinieneś móc używać obu opcji --quieti --silent, jak w

npm install --quiet

--quietpokaże stderr i ostrzeżenia, --silentpowinien wyłączyć prawie wszystko

Możesz również wysłać stdout / stderr do /dev/null, na przykład:

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

lub mniej versbose

npm install &> /dev/null
Alexander Mills
źródło
7
W systemie Windows jest to instalacja npm --quiet> NUL
Manohar Reddy Poreddy
4
To pytanie dotyczy w szczególności uruchamiania skryptów npm .
hackel
7
npm install --quiet --no-progress 

Zachowa ostrzeżenia i błędy oraz pominie pasek postępu ADHD na terminalach, które go obsługują.

Michael Cole
źródło
3
To pytanie dotyczy w szczególności uruchamiania skryptów npm .
hackel
1

Możesz to zrobić wewnątrz skryptu, usuwając detektory zdarzeń

#!/usr/bin/env node

process.removeAllListeners('warning');

// Do your thang without triggering warnings
ErisDS
źródło