Uruchamianie skryptów NPM sekwencyjnie

150

Powiedzmy, że tak

"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\""
  },

Jakie polecenie NPM mogę uruchomić, aby wszystkie te skrypty były uruchamiane sekwencyjnie. Kiedy używam naprawy przed / po, uruchamiają się sekwencyjnie, ale nie czekają na zakończenie skryptu nadrzędnego przed wykonaniem. Zakładam, że jedynym rozwiązaniem jest: Jak sprawić, aby zadania Gulp były uruchamiane sekwencyjnie podczas odpalania poleceń powłoki w funkcji pomocniczej async.series? ? Wiem, że można to zrobić za pomocą Gulp, ale chciałbym na razie pozostać przy NPM, aby zbadać jego możliwości. Dzięki za pomoc!

Ryż
źródło
Zaktualizowana odpowiedź na dole
Tzach Ovadia
Zgodnie z dokumentacją Startpolecenia powinieneś móc użyć /waitparametru (Uruchom aplikację i poczekaj, aż się zakończy)
Tzach Ovadia

Odpowiedzi:

316

Wywołaj te skrypty za pomocą npm run i połącz je z podwójnym ampersandem &&:

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

Wyjaśnienie:

  • Użyj &&(podwójny ampersand) do sekwencyjnego wykonywania.
  • Użyj &(pojedynczy znak ampersand) do wykonywania równoległego.
Mobiletainment
źródło
4
Działa to najlepiej, ponieważ jest wykonywane w kolejności, ponieważ każde polecenie nie jest wykonywane, dopóki poprzednie nie zostaną zakończone, zgodnie z żądaniem w OP. Dzięki
Rice
20
&&są oceniane przez powłokę i nie działają w systemie Windows.
Bernhard Döbler
12
To nie powinna być akceptowana odpowiedź. Według @ BernhardDöbler, &&składnia jest konstrukcją UNIX. Będzie działać niepoprawnie na komputerach z systemem Windows, co może mieć poważne konsekwencje dla procesu kompilacji.
Rafe Goldberg
3
@RafeGoldberg Operator && zachowuje się tak samo podczas wykonywania w środowiskach Windows i * nix, tj. Wykonywanie sekwencyjne… Chyba że jest coś, czego wszyscy brakuje?
Ryż
3
@Rice oy vey; byłem głupi i mieszałem moje pojedyncze i podwójne ampersand operatory. Zgodnie z npm-run-alldokumentacją: „czasami używamy &do uruchamiania wielu poleceń równolegle, ale system Windows ' cmd.exe... nie obsługuje [tego operatora]”. Wygląda więc na to, że masz rację - przynajmniej z moich krótkich badań wynika, że &&operator wydaje się doskonale kompatybilny z różnymi platformami.
Rafe Goldberg
31

Zgodnie ze świetną odpowiedzią @ Mobiletainment , możesz również użyć npm-run-all, aby polecenie było znacznie krótsze i bardziej czytelne. W Twoim przypadku:

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

run-sjest skrótem npm-run-all, który uruchamia wszystkie podane skrypty npm sekwencyjnie, stąd -s( run-sjest krótszą wersją npm-run-all -s).

Lub A.
źródło
19

Możesz po prostu umieścić je w innym skrypcie. "start": "pre-build && build_logic && post_build && exit"

Dave V
źródło
2
Wymagałbym, aby zaczekali, aż się skończą, będą odpalać sekwencyjnie, ale nie będą czekać.
Ryż
2
Nie sądzę, że jest to problem z węzłem / npm. startKomenda realizujemy w oknach technicznie jest gotowy. Użyj /waitflagi z, startaby wymusić, aby startaplikacja pozostała otwarta do czasu zakończenia również metody wewnętrznej.
dvlsg
Aby to przetestować - uruchom start notepadz wiersza polecenia, a następnie spójrz na oryginalny wiersz polecenia. Powinieneś móc wpisać inne polecenie. Następnie biegnij start /wait notepad. startKomenda powinna nadal „run” w czasie, gdy okno jest otwarte schowek (spójrz w wierszu Znowu poleceń). Następnie po zamknięciu notatnika startzostanie zakończone.
dvlsg
Rozwiązanie \ wait nie działa w przypadku poleceń dołączanych za pomocą podwójnego ampersand lub stałych poleceń npm pre / post.
Ryż
15

Można poprzedzić skrypty prei posttak są one uruchamiane automatycznie:

"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\""
}

następnie uruchomić npm run build

Tzach Ovadia
źródło
to nie działa, jak wskazano w pytaniu: „Kiedy używam naprawy pre / post, uruchamiają się one sekwencyjnie, ale nie czekają na zakończenie skryptu nadrzędnego przed wykonaniem”.
Russell Chisholm
3

możesz spróbować:


"scripts": {
  "clean-dist": "rm -f ./dist/*.js && rm -f ./dist/*.map",
  "build": "npm run clean-dist && parcel build ./packages/index.html"
},
Muhammed Moussa
źródło
2

Możesz użyć npm-run-all do łączenia wielu poleceń na wiele różnych sposobów

Na przykład, jeśli masz w swoim skrypcie następujące skrypty package.json:

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

Możesz uruchomić je wszystkie sekwencyjnie w następujący sposób:

$ npm-run-all clean lint build

Zobacz to pytanie, aby dowiedzieć się, jak równolegle uruchamiać wiele poleceń npm

KyleMit
źródło
1
To jest odpowiednie rozwiązanie. npm-run-all jest najlepszy. I utworzy plik package.json, który jest wieloplatformowy.
Robert