Como suprimir a saída ao executar scripts npm


97

Decidi experimentar scripts npm como uma ferramenta de construção e até agora gosto disso. Um problema que eu gostaria de resolver é ao executar um script para executar jshint quando algo não passa linting, recebo uma tonelada de "npm ERR!" linhas. Eu gostaria de suprimir isso, pois a saída do linter é mais significativa.

Existe uma boa maneira de definir isso globalmente e há uma maneira de defini-lo para cada execução de script?

node.js  npm 

Possível duplicação de erros
npm

Há um problema com este tópico em: github.com/npm/npm/issues/6124
daotoad

Respostas:


167

Todos os scripts:

Você pode corrigir isso suprimindo a saída de npm geral, definindo o nível de registro de silentalgumas maneiras:

Em cada npm runinvocação:

npm run --silent <your-script>

Ou globalmente, criando um .npmrcarquivo (esse arquivo pode estar no diretório do seu projeto ou na sua pasta inicial) com o seguinte:

loglevel=silent

Recursos:

Configuração de nível de registro npm: https://docs.npmjs.com/misc/config#loglevel

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

Cada script, individualmente:

Um truque simples que usei para contornar esse problema em certos scripts, como linting, é anexar || trueno final desses scripts. Isso funcionará sem quaisquer alterações de configuração do npm.

Isso garantirá que o script sempre saia com um 0status. Isso leva o npm a pensar que o script foi bem-sucedido, ocultando as ERRmensagens. Se você quiser ser mais explícito, pode acrescentar em || exit 0vez disso e deve obter o mesmo resultado.

{
  "scripts": {
    "lint": "jshint || true",
   }
}

|| true não funciona se você estiver tentando anexar args ao final da execução do npm - por exemplo. npm prazo myCmd - --deploy
arcseldon

4
Isso é realmente absurdo (não culpar você). Eu não quero acrescentar || true; essa não é uma boa solução. Não quero silenciar TODOS os outros comandos usando .npmrc. E executar esse script em particular -so tempo todo também parece muito bobo. Alguém encontrou uma solução melhor para silenciar um único script?
PascalVKooten

Caso alguém descubra isso, há um problema em aberto - consulte github.com/npm/npm/issues/8821 .
Ian Routledge

loglevel = silent parece exagero para mim. Isso silenciaria até mesmo as mensagens de erro (embora ainda fossem gravadas em um arquivo local). De acordo com o link logo após esta sugestão, os níveis de log possíveis, em ordem de prioridade, são: "silencioso", "erro", "avisar", "aviso", "http", "tempo", "informação", "detalhado ", "boba". Eu sugeriria "erro" (que suprimiria avisos, mas exibiria erros) ou "aviso" (que incluiria avisos). Normalmente não há razão para o npm nos mostrar como ele decide o que executar, que é o que ele faz por padrão. Isso parece depurar texto.
John Deighan

OK, preciso me corrigir e levantar uma objeção. Talvez seja até mesmo um bug do node.js? Quando criei um arquivo .npmrc com 'loglevel = error', a execução de 'npm test' ainda rastreava a lógica do npm sobre como ele determinava qual linha de comando executar. Node versão 8.12.0, npm versão 5.8.0.
John Deighan

45

Você deve ser capaz de usar as opções --quiete --silent, como em

npm install --quiet

--quietirá mostrar stderr e avisos, --silentdeve suprimir quase tudo

Você também pode enviar stdout / stderr para /dev/null, assim:

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

ou menos versbose

npm install &> /dev/null

7
No Windows, é npm install --quiet> NUL
Manohar Reddy Poreddy

4
Esta pergunta é especificamente sobre a execução de scripts npm .
hackel de

--quietfunciona para scripts npm;) @hackel
IG Pascual

8
npm install --quiet --no-progress 

Manterá avisos e erros e suprimirá a barra de progresso do TDAH nos terminais que o suportam.


3
Esta pergunta é especificamente sobre a execução de scripts npm .
hackel de

0

Você pode fazer isso dentro do seu script, removendo os ouvintes de evento

#!/usr/bin/env node

process.removeAllListeners('warning');

// Do your thang without triggering warnings

-1

para um script individual que você deseja manter em silêncio sem ter que adicionar a --silentcada vez, você pode fazer um novo script que chama o anterior e adiciona --silent.

Meus scripts de exemplo em package.json:

    "dev-loud": "npm run build && nodemon -r dotenv/config dist/index.js",
    "dev": "npm run dev-loud --silent"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.