No meu package.json
eu tenho esses dois scripts:
"scripts": {
"start-watch": "nodemon run-babel index.js",
"wp-server": "webpack-dev-server",
}
Eu tenho que executar esses 2 scripts em paralelo toda vez que começo a desenvolver no Node.js. A primeira coisa que pensei foi adicionar um terceiro script como este:
"dev": "npm run start-watch && npm run wp-server"
... mas isso vai esperar para start-watch
terminar antes de executar wp-server
.
Como posso executá-los em paralelo? Por favor, lembre-se de que preciso ver os output
comandos. Além disso, se sua solução envolve uma ferramenta de compilação, prefiro usá-la em gulp
vez de grunt
usá-la em outro projeto.
javascript
node.js
build
André Pena
fonte
fonte
&&
executará seus scripts sequencialmente enquanto&
os executará em paralelo .npm run start-watch & npm run wp-server
. Isso executará o primeiro comando como um encadeamento em segundo plano. Isso funciona muito bem quando um dos comandos não é demorado e não precisa ser encerrado manualmente mais tarde. Algo comoconcurrently
permite que você mate todos os threads ao mesmo tempo com CTRL-C.Respostas:
Use um pacote chamado simultaneamente .
npm i concurrently --save-dev
Em seguida, configure sua
npm run dev
tarefa da seguinte maneira:fonte
node ./node_modules/concurrently/src/main.js
Não é necessário.concurrent
vai funcionar muito bem em scripts porque o módulo instala um bin para./node_modules/.bin/concurrent
concurrently
use vários fluxos que mexam com a saída do console (as cores podem ficar estranhas, o cursor desapareceu) enquantoparallelshell
não tiver esse problema .--raw
modo para preservar as cores na saída.Se você estiver usando um ambiente semelhante ao UNIX, use
&
como separador:Caso contrário, se você estiver interessado em uma solução de plataforma cruzada, poderá usar o módulo npm-run-all :
fonte
a && b
iniciab
após aa
conclusão com êxito, mas o nodemon nunca para sem erros, portanto isso não funciona.a & b
iniciaa
, move-o para o fundo e iniciab
imediatamente. Ganhar!a | b
canaliza o stdout dea
para o stdin dob
qual requer ambos executando simultaneamente. Embora isso pareça ter o efeito desejado, você não deve usá-lo aqui.&
é uma péssima idéia, pois desanexa o processo. Isso significa quenpm
não será mais o processo pai. Você vai acabar com um zumbinpm run start-watch
que não será mortoctrl-c
.wait
ao problema mitigar com os processos de suspensão:"dev": "npm run start-watch & npm run wp-server & wait"
&
no unix, impede que o comando responda a Cc / Cz e também impede que seu código de retorno se propague em caso de falha.No windows cmd, você pode usar
start
:Todo comando lançado dessa maneira começa em sua própria janela.
fonte
&&
aguarda a conclusão do primeiro comando antes de iniciar o segundo comando e uma tarefa do observador nunca será concluída.Você deve usar o npm-run-all (ou
concurrently
,parallelshell
), porque ele tem mais controle sobre os comandos de iniciar e matar. Os operadores&
,|
são idéias ruins porque você vai precisar para pará-lo manualmente após todos os testes forem concluídos.Este é um exemplo para teste de transferidor através do npm:
-p
= Execute comandos em paralelo.-r
= Mate todos os comandos quando um deles terminar com um código de saída zero.A execução
npm run test
iniciará o driver Selenium, iniciará o servidor http (para servir os arquivos) e executará testes de transferidor. Após a conclusão de todos os testes, ele fechará o servidor http e o driver selênio.fonte
gulp
egulp-sync
?Você pode usar um
&
para script de execução paralelaLink de referência
fonte
Uma solução melhor é usar
&
fonte
&
funciona no Windows, mas funciona de maneira diferente. No OSX, ele executará os dois comandos simultaneamente, mas no Windows, executará o primeiro comando e, depois que o primeiro comando existir, executará o segundo comando.Eu verifiquei quase todas as soluções de cima e só com o npm-run-all consegui resolver todos os problemas. A principal vantagem sobre todas as outras soluções é a capacidade de executar scripts com argumentos .
Isso me permite executar o comando com argumentos como
npm run test:watch -- Something
.EDITAR:
Há mais uma opção útil para
npm-run-all
:Adicione
-r
ao seunpm-run-all
script para eliminar todos os processos quando um terminar com o código0
. Isso é especialmente útil quando você executa um servidor HTTP e outro script que usa o servidor.fonte
Eu tenho uma solução multiplataforma sem módulos adicionais . Eu estava procurando por algo como um bloco try catch que eu pudesse usar no cmd.exe e no bash.
A solução é
command1 || command2
que parece funcionar nos dois ambientes iguais. Portanto, a solução para o OP é:Então simples
npm start
(enpm run dev
) funcionará em todas as plataformas!fonte
Se você substituir o e comercial duplo por um único e comercial, os scripts serão executados simultaneamente.
fonte
Solução Rápida
Nesse caso, eu diria a melhor apostaSe esse script for para um módulo privado destinado a ser executado apenas em máquinas baseadas em * nix , você pode usar o operador de controle para processos de bifurcação, parecidos com o seguinte:&
Um exemplo de como fazer isso em um arquivo package.json parcial:
Você os executaria em paralelo via
npm run serve-bundle
. Você pode aprimorar os scripts para gerar os pids do processo bifurcado em um arquivo como este:Google algo como operador de controle bash para bifurcação para saber mais sobre como funciona. Também forneci algum contexto adicional sobre o aproveitamento das técnicas Unix nos projetos do Nó abaixo:
Contexto adicional RE: Ferramentas Unix e Node.js
Se você não estiver no Windows, as ferramentas / técnicas do Unix geralmente funcionam bem para obter algo com os scripts do Node porque:
Módulos para tarefas do sistema em Nodeland também costumam ser abstrações ou aproximações de ferramentas Unix, de
fs
atéstreams
.fonte
&
operador não é suportado no Windows.editar:
Você precisa ter o npm-run-all instalado previamente. Verifique também esta página para outros cenários de uso.
fonte
Que tal bifurcação
Outra opção para executar vários scripts de Nó é com um único script de Nó, que pode bifurcar muitos outros. A bifurcação é suportada nativamente no Node, portanto, não adiciona dependências e é multiplataforma.
Exemplo mínimo
Isso apenas executaria os scripts como estão e presume que eles estejam localizados no diretório do script pai.
Exemplo detalhado
Isso executaria os scripts com argumentos e configurados pelas várias opções disponíveis.
Comunicação com scripts bifurcados
A bifurcação também tem o benefício adicional de que o script pai possa receber eventos dos processos filho bifurcados, bem como enviar de volta. Um exemplo comum é o script pai matar seus filhos bifurcados.
Para mais eventos e métodos disponíveis, consulte a
ChildProcess
documentaçãofonte
Eu tive problemas com
&
e|
, que saem de status e erros, respectivamente.Outras soluções desejam executar qualquer tarefa com um nome específico, como npm-run-all, que não era meu caso de uso.
Então, eu criei o npm-run-parallel que executa scripts npm de forma assíncrona e relata quando eles terminam.
Portanto, para seus scripts, seria:
npm-run-parallel wp-server start-watch
fonte
No meu caso, eu tenho dois projetos, um era UI e o outro era API , e ambos têm seu próprio script em seus respectivos
package.json
arquivos.Então, aqui está o que eu fiz.
fonte
node app
) e API (Angular em uma subpasta src , acho que écd src/ng serve
), apenas a primeira parte funciona. Por exemplonode app& cd src& ng serve
.package.json:
Mais informações: https://github.com/mysticatea/npm-run-all/blob/master/docs/npm-run-all.md
fonte
Uso o npm-run-all há algum tempo, mas nunca me dei bem com ele, porque a saída do comando no modo de observação não funciona bem juntos. Por exemplo, se eu iniciar
create-react-app
ejest
no modo de exibição, só poderei ver a saída do último comando executado. Então, na maioria das vezes, eu estava executando todos os meus comandos manualmente ...É por isso que eu implemento minha própria lib, tela de execução . Ainda é um projeto muito jovem (de ontem: p), mas pode valer a pena examiná-lo, no seu caso seria:
Em seguida, pressione a tecla numérica
1
para ver a saída dewp-server
e pressione0
para ver a saída destart-watch
.fonte
Minha solução é semelhante à do Piittis, embora eu tenha tido alguns problemas ao usar o Windows. Então eu tive que validar para o win32.
fonte
Script de nó simples para você continuar sem muita trabalheira. Usando o readline para combinar saídas para que as linhas não fiquem mutiladas.
fonte
esse trabalho no windows
fonte