Bagaimana cara menekan keluaran saat menjalankan skrip npm

93

Saya telah memutuskan untuk bereksperimen dengan skrip npm sebagai alat pembuatan dan sejauh ini saya menyukainya. Satu masalah yang ingin saya selesaikan adalah saat menjalankan skrip untuk menjalankan jshint ketika sesuatu tidak lolos linting, saya mendapatkan banyak sekali "npm ERR!" garis. Saya ingin menyembunyikannya karena keluaran dari linter lebih bermakna.

Adakah cara yang baik untuk menyetelnya secara global dan adakah cara untuk menyetelnya untuk setiap skrip yang dijalankan?


sumber
Ada masalah tentang topik ini di: github.com/npm/npm/issues/6124
daotoad

Jawaban:

159

Semua skrip:

Anda dapat memperbaikinya dengan menekan keluaran npm secara keseluruhan, dengan menyetel level log ke silentdalam beberapa cara:

Di setiap npm rundoa:

npm run --silent <your-script>

Atau secara global dengan membuat .npmrcfile (file ini bisa di direktori proyek atau folder utama Anda) dengan berikut ini:

loglevel=silent

Sumber:

konfigurasi tingkat log npm: https://docs.npmjs.com/misc/config#loglevel

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

Setiap skrip, satu per satu:

Trik sederhana yang saya gunakan untuk mengatasi masalah ini pada skrip tertentu seperti linting adalah dengan menambahkan || truedi akhir skrip tersebut. Ini akan bekerja tanpa perubahan konfigurasi npm.

Ini akan memastikan bahwa skrip akan selalu keluar dengan 0status. Ini menipu npm untuk berpikir bahwa skrip berhasil, sehingga menyembunyikan ERRpesan. Jika Anda ingin lebih eksplisit, Anda dapat menambahkan || exit 0sebagai gantinya dan itu akan mencapai hasil yang sama.

{
  "scripts": {
    "lint": "jshint || true",
   }
}
Sanketh Katta
sumber
|| true tidak berfungsi jika Anda mencoba menambahkan args ke akhir proses npm - mis. npm jalankan myCmd - --deploy
arcseldon
4
Ini sangat tidak masuk akal (tidak menyalahkan Anda). Saya tidak ingin menambahkan || true; itu bukan solusi yang bagus. Saya tidak ingin membungkam SEMUA perintah lain menggunakan .npmrc. Dan menjalankan skrip khusus ini -ssepanjang waktu juga tampak sangat konyol. Adakah yang menemukan solusi yang lebih baik untuk membungkam satu skrip?
PascalVKooten
Jika ada orang lain yang menemukan ini, ada masalah terbuka - lihat github.com/npm/npm/issues/8821 .
Ian Routledge
loglevel = silent tampaknya berlebihan bagi saya. Itu akan membungkam bahkan pesan kesalahan (meskipun mereka masih akan ditulis ke file lokal). Berdasarkan tautan segera setelah saran ini, tingkat log yang mungkin, dalam urutan prioritas, adalah: "silent", "error", "warn", "notice", "http", "timing", "info", "verbose "," konyol ". Saya akan menyarankan "error" (yang akan menyembunyikan peringatan, tetapi menampilkan error) atau "warn" (yang akan menyertakan peringatan). Biasanya tidak ada alasan bagi npm untuk menunjukkan kepada kita bagaimana ia memutuskan apa yang akan dijalankan, yang dilakukan secara default. Rasanya seperti men-debug teks.
John Deighan
Oke, saya perlu mengoreksi diri sendiri, dan mengajukan keberatan. Mungkin itu bahkan bug node.js? Ketika saya membuat file .npmrc dengan 'loglevel = error', menjalankan 'npm test' masih ditelusuri melalui logika npm tentang bagaimana itu menentukan baris perintah apa yang akan dijalankan. Node versi 8.12.0, npm versi 5.8.0.
John Deighan
44

Anda harus dapat menggunakan opsi --quietdan --silent, seperti pada

npm install --quiet

--quietakan menampilkan stderr dan peringatan, --silentharus menyembunyikan hampir semuanya

Anda juga dapat mengirim stdout / stderr ke /dev/null, seperti:

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

atau kurang versbose

npm install &> /dev/null
Alexander Mills
sumber
7
Di Windows, ini adalah npm install --quiet> NUL
Manohar Reddy Poreddy
4
Pertanyaan ini secara khusus tentang menjalankan skrip npm .
hackel
7
npm install --quiet --no-progress 

Akan menyimpan peringatan dan kesalahan, dan menekan bilah kemajuan ADHD pada terminal yang mendukungnya.

Michael Cole
sumber
3
Pertanyaan ini secara khusus tentang menjalankan skrip npm .
hackel
1

Anda dapat melakukan ini di dalam skrip Anda dengan menghapus event listener

#!/usr/bin/env node

process.removeAllListeners('warning');

// Do your thang without triggering warnings
ErisDS
sumber
0

untuk setiap skrip yang ingin Anda diam tanpa harus menambahkan --silentsetiap kali, Anda dapat membuat skrip baru yang memanggil skrip sebelumnya dan menambahkan --silent.

Skrip contoh saya di package.json:

    "dev-loud": "npm run build && nodemon -r dotenv/config dist/index.js",
    "dev": "npm run dev-loud --silent"
Ross
sumber