Executando Scripts NPM Sequencialmente

150

Digamos que eu tenho

"scripts": {
    "pre-build": "echo \"Welcome\" && exit 1",
    "build_logic": "start cmd.exe @cmd /k \"yo esri-appbuilder-js:widget && exit 1\"",
    "post_build":  "start C:\\WebAppBuilderForArcGIS\\startupShortcut",
    "exit" : "start cmd.exe @cmd /k \"echo \"goodbye\" && exit 1\""
  },

Qual comando do NPM posso executar para permitir que todos esses scripts sejam iniciados sequencialmente. Quando uso a correção pré / pós, eles são iniciados seqüencialmente, mas não esperam o script pai terminar antes de executar. Estou assumindo que a única solução é: Como faço para que as tarefas do Gulp sejam acionadas sequencialmente ao disparar comandos do shell em uma função auxiliar do async.series? ? Eu sei que isso pode ser feito com o Gulp, mas eu gostaria de permanecer no NPM por enquanto para explorar suas capacidades. Obrigado por qualquer ajuda!

Arroz
fonte
Resposta atualizada na parte inferior
Tzach Ovadia
De acordo com a documentação de Startcomando, você deve ser capaz de usar /waitparâmetro (aplicação Iniciar e esperar por ele para terminar)
Tzach Ovadia

Respostas:

316

Invoque esses scripts via npm run e encadeie-os com e comercial duplo &&:

npm run pre-build && npm run build_logic && npm run post_build && npm run exit

Explicação:

  • Use &&(duplo e comercial) para execução sequencial.
  • Use &(único e comercial) para execução paralela.
Mobiletainment
fonte
4
Isso funciona melhor porque é executado em ordem, sendo que cada comando não é executado até que os previos sejam concluídos, conforme solicitado no OP. Graças
Arroz
20
&&são avaliados pelo shell e não funcionam no Windows.
Bernhard Döbler 13/03/19
12
Esta não deve ser a resposta aceita. Por @ BernhardDöbler, a &&sintaxe é uma construção UNIX. Ele se comportará incorretamente nas máquinas do Windows, com conseqüências potencialmente prejudiciais para o processo de compilação.
Rafe Goldberg
3
@RafeGoldberg O operador && tem o mesmo comportamento de execução nos ambientes Windows e * nix, ou seja, execução seqüencial ... A menos que haja algo que está faltando?
Rice
3
@Rice oy vey; estava sendo burro e misturando meus operadores de um e comercial duplo. De acordo com os npm-run-alldocumentos: “às vezes usamos &para executar vários comandos em paralelo, mas o Windows ' cmd.exe... não suporta [esse operador].” Parece que você estava certo - pelo menos, a partir de minha breve pesquisa, o &&operador parece perfeitamente compatível com várias plataformas.
Rafe Goldberg
31

Após a ótima resposta do @ Mobiletainment , você também pode usar o npm-run-all para tornar o comando muito mais curto e muito mais legível. No seu caso:

"scripts": {
    ...
    "build": "run-s pre-build build_logic post_build exit"
}

run-sé um atalho npm-run-allfornecido, que executa todos os scripts npm fornecidos seqüencialmente, daí a -s( run-sé uma versão mais curta npm-run-all -s).

Ou A.
fonte
19

Você pode simplesmente colocá-los em outro script. "start": "pre-build && build_logic && post_build && exit"

Dave V
fonte
2
Eu exigiria que eles esperassem um pelo outro terminar, eles disparariam sequencialmente, mas não esperariam.
Rice
2
Eu não acho que este seja um problema do nó / npm. O startcomando que você estiver executando o Windows tecnicamente é acabado. Use o /waitsinalizador com startpara forçar o startaplicativo a permanecer aberto até que o método interno também seja concluído.
precisa saber é
Para testar isso - execute a start notepadpartir de um prompt de comando e dê uma olhada no prompt de comando original. Você deve poder digitar outro comando. Então corra start /wait notepad. O startcomando deve continuar a "executar" enquanto a janela do seu bloco de notas estiver aberta (consulte o prompt de comando novamente). Então, quando você fechar o bloco de notas, startserá concluído.
Dvlsg
A solução \ wait não funciona para comandos anexados via duplo e comercial ou comandos pré / pós npm fixos.
Rice
15

Você pode prefixar seus scripts pree posteles serão executados automaticamente:

"scripts": {
  "prebuild": "echo \"Welcome\" && exit 1",
  "build": "start cmd.exe @cmd /k \"yo esri-appbuilder-js:widget && exit 1\"",
  "postbuild":  "start C:\\WebAppBuilderForArcGIS\\startupShortcut",
  "exit" : "start cmd.exe @cmd /k \"echo \"goodbye\" && exit 1\""
}

então corra npm run build

Tzach Ovadia
fonte
isso não funciona, conforme indicado na pergunta: "Quando eu uso a correção pré / pós, eles são iniciados sequencialmente, mas não esperam o script pai terminar antes de executar".
Russell Chisholm
3

podes tentar:


"scripts": {
  "clean-dist": "rm -f ./dist/*.js && rm -f ./dist/*.map",
  "build": "npm run clean-dist && parcel build ./packages/index.html"
},
Muhammed Moussa
fonte
2

Você pode usar o npm-run-all para combinar vários comandos de várias maneiras diferentes

Por exemplo, se você tivesse os seguintes scripts no seu package.json:

"scripts": {
    "clean": "rimraf dist",
    "lint":  "eslint src",
    "build": "babel src -o lib"
}

Você pode executá-los todos sequencialmente assim:

$ npm-run-all clean lint build

Consulte esta pergunta para saber como executar vários comandos npm em paralelo

KyleMit
fonte
1
Este é o caminho a percorrer. npm-run-all é o melhor. E produzirá um package.json que é multiplataforma.
Robert