W moim package.json
mam te dwa skrypty:
"scripts": {
"start-watch": "nodemon run-babel index.js",
"wp-server": "webpack-dev-server",
}
Te 2 skrypty muszę uruchamiać równolegle za każdym razem, gdy zaczynam programować w Node.js. Pierwszą rzeczą, o której myślałem, było dodanie trzeciego skryptu takiego:
"dev": "npm run start-watch && npm run wp-server"
... ale będzie czekać na start-watch
zakończenie przed uruchomieniem wp-server
.
Jak mogę je uruchomić równolegle? Pamiętaj, że muszę zobaczyć output
te polecenia. Ponadto, jeśli twoje rozwiązanie wymaga narzędzia do kompilacji, wolę użyć gulp
zamiast tego, grunt
ponieważ używam go już w innym projekcie.
javascript
node.js
build
André Pena
źródło
źródło
&&
uruchomi twoje skrypty sekwencyjnie, jednocześnie&
uruchomi je równolegle .npm run start-watch & npm run wp-server
. Spowoduje to uruchomienie pierwszego polecenia jako wątku w tle. Działa to naprawdę dobrze, gdy jedno z poleceń nie jest długo uruchamiane i nie trzeba później ręcznie go opuszczać. Coś takiegoconcurrently
pozwala zabić wszystkie wątki jednocześnie za pomocą CTRL-C.Odpowiedzi:
Użyj pakietu o nazwie współbieżnej .
npm i concurrently --save-dev
Następnie skonfiguruj swoje
npm run dev
zadanie w następujący sposób:źródło
node ./node_modules/concurrently/src/main.js
nie jest potrzebne.concurrent
będzie działał dobrze w skryptach, ponieważ moduł instaluje bin do./node_modules/.bin/concurrent
concurrently
używa wielu strumieni, które psują się z wyjściem konsoli (kolory mogą się dziwnie zabraknąć, kursor zniknie),parallelshell
ale nie ma tego problemu .--raw
trybu, aby zachować kolory na wydruku.Jeśli używasz środowiska podobnego do UNIX, po prostu użyj
&
jako separatora:W przeciwnym razie, jeśli jesteś zainteresowany rozwiązaniem wieloplatformowym, możesz użyć npm-run-all module:
źródło
a && b
uruchamia sięb
poa
pomyślnym zakończeniu, ale nodemon nigdy nie zatrzymuje się bez błędów, więc to nie działa.a & b
uruchamia sięa
, przenosi go w tło i zaczynab
od razu. Zdobyć!a | b
potoki, których stdouta
jest do stdin,b
których oba wymagają jednoczesnego działania. Chociaż może to wydawać się pożądanym efektem, nie powinieneś go tutaj używać.&
to naprawdę zły pomysł, ponieważ oddziela ten proces. Oznacza to, żenpm
nie będzie to już proces nadrzędny. Skończysz z zombie,npm run start-watch
którego nie zabijeszctrl-c
.wait
aby złagodzić problem z procesami zawieszania:"dev": "npm run start-watch & npm run wp-server & wait"
&
w systemie uniksowym komenda nie reaguje na polecenie Cc / Cz, a także zapobiega propagacji kodu powrotu w przypadku awarii.Z Windows cmd możesz użyć
start
:Każde polecenie uruchomione w ten sposób rozpoczyna się we własnym oknie.
źródło
&&
czeka ono na zakończenie pierwszego polecenia przed uruchomieniem drugiego polecenia, a zadanie obserwatora nigdy się nie zakończy.Powinieneś użyć npm-run-all (lub
concurrently
,parallelshell
), ponieważ ma on większą kontrolę nad poleceniami uruchamiania i zabijania. Operatorzy&
,|
są złe pomysły, ponieważ trzeba ręcznie zatrzymać go po zakończeniu wszystkich testów.To jest przykład testowania kątomierza za pomocą npm:
-p
= Uruchom polecenia równolegle.-r
= Zabij wszystkie polecenia, gdy jedno z nich zakończy się kodem wyjścia równym zero.Uruchomienie
npm run test
uruchomi sterownik Selenium, serwer HTTP (do obsługi plików) i uruchomi testy kątomierza. Po zakończeniu wszystkich testów zamknie serwer http i sterownik selenu.źródło
gulp
igulp-sync
?Możesz użyć jednego
&
do skryptu równoległegoLink referencyjny
źródło
Lepszym rozwiązaniem jest użycie
&
źródło
&
działa w systemie Windows, ale działa inaczej. W OSX uruchomi oba polecenia jednocześnie, ale w systemie Windows uruchomi pierwsze polecenie, a po istnieniu pierwszego polecenia uruchomi drugie polecenie.Sprawdziłem prawie wszystkie rozwiązania z góry i tylko z npm-run-all udało mi się rozwiązać wszystkie problemy. Główną przewagą nad wszystkimi innymi rozwiązaniami jest możliwość uruchamiania skryptu z argumentami .
To pozwala mi uruchamiać polecenie z argumentami takimi jak
npm run test:watch -- Something
.EDYTOWAĆ:
Jest jeszcze jedna przydatna opcja dla
npm-run-all
:Dodaj
-r
donpm-run-all
skryptu, aby zabić wszystkie procesy, gdy skończysz z kodem0
. Jest to szczególnie przydatne, gdy uruchamiasz serwer HTTP i inny skrypt korzystający z serwera.źródło
Mam rozwiązanie typu crosssplatform bez żadnych dodatkowych modułów . Szukałem czegoś w rodzaju bloku catch catch, którego mógłbym użyć zarówno w cmd.exe, jak i w bashu.
command1 || command2
Wydaje się, że rozwiązanie działa tak samo w obu środowiskach. Tak więc rozwiązaniem dla PO jest:Wtedy prosty
npm start
(inpm run dev
) będzie działał na wszystkich platformach!źródło
Jeśli zastąpisz podwójny znak ampersand pojedynczym znakiem ampersand, skrypty będą działać jednocześnie.
źródło
Szybkie rozwiązanie
W takim przypadku powiedziałbym, że najlepszy wybórJeśli ten skrypt jest przeznaczony dla modułu prywatnego przeznaczonego do uruchamiania tylko na komputerach z * nix , możesz użyć operatora sterującego do rozwidlania procesów, który wygląda następująco:&
Przykład wykonania tego w częściowym pliku package.json:
Następnie wykonałeś je oba równolegle przez
npm run serve-bundle
. Możesz ulepszyć skrypty, aby wypisywać pid z rozwidlonego procesu do pliku takiego jak:Google coś jak operator kontroli bash za rozwidlanie aby dowiedzieć się więcej o tym, jak to działa. Przedstawiłem również trochę dalszego kontekstu dotyczącego wykorzystania technik uniksowych w projektach Node:
Dalszy kontekst RE: Unix Tools & Node.js
Jeśli nie korzystasz z systemu Windows, narzędzia / techniki uniksowe często działają dobrze, aby osiągnąć coś za pomocą skryptów Node, ponieważ:
Moduły do zadań systemowych w Nodeland są często abstrakcjami lub aproksymacjami narzędzi uniksowych od
fs
dostreams
.źródło
&
operator nie jest obsługiwany w systemie Windows.edytować:
Musisz wcześniej zainstalować npm-run-all . Sprawdź również tę stronę pod kątem innych scenariuszy użytkowania.
źródło
Co powiesz na rozwidlenie
Inną opcją uruchamiania wielu skryptów Node jest jeden skrypt Node, który może rozwidlać wiele innych. Rozwidlenie jest obsługiwane natywnie w Węźle, więc nie dodaje żadnych zależności i jest wieloplatformowe.
Minimalny przykład
Spowodowałoby to po prostu uruchomienie skryptów bez zmian i przyjęcie, że znajdują się one w katalogu skryptu nadrzędnego.
Pełen przykład
Spowodowałoby to uruchomienie skryptów z argumentami i skonfigurowanych według wielu dostępnych opcji.
Komunikacja za pomocą rozwidlonych skryptów
Forking ma również tę dodatkową zaletę, że skrypt nadrzędny może odbierać zdarzenia z rozwidlonych procesów potomnych, a także odsyłać. Typowym przykładem jest skrypt nadrzędny, który zabija rozwidlone dzieci.
Więcej dostępnych zdarzeń i metod znajduje się w
ChildProcess
dokumentacjiźródło
Wystąpiły problemy z
&
i|
, które odpowiednio wychodzą ze stanu i zgłaszają błędy.Inne rozwiązania chcą uruchomić dowolne zadanie o podanej nazwie, np. Npm-run-all, co nie było moim przypadkiem użycia.
Więc stworzyłem npm-run-parallel, który uruchamia skrypty npm asynchronicznie i raportuje, kiedy są gotowe.
W przypadku twoich skryptów byłoby to:
npm-run-parallel wp-server start-watch
źródło
W moim przypadku mam dwa projekty, jeden to interfejs użytkownika, a drugi to interfejs API , a oba mają własny skrypt w odpowiednim
package.json
plikach.Oto co zrobiłem.
źródło
node app
) i API (Angular w podfolderze src , zgadnij, żecd src/ng serve
), działa tylko pierwsza część. Na przykładnode app& cd src& ng serve
.package.json:
Więcej informacji: https://github.com/mysticatea/npm-run-all/blob/master/docs/npm-run-all.md
źródło
Używam npm-run-all od jakiegoś czasu, ale nigdy się z tym nie zgadzałem, ponieważ dane wyjściowe polecenia w trybie oglądania nie działają dobrze razem. Na przykład, jeśli zacznę
create-react-app
ijest
w trybie zegarka, będę mógł zobaczyć dane wyjściowe z ostatniego uruchomionego polecenia. Przez większość czasu wszystkie moje polecenia były uruchamiane ręcznie ...Dlatego implementuję własną bibliotekę lib, run-screen . To wciąż bardzo młody projekt (od wczoraj: p), ale warto na niego spojrzeć, w twoim przypadku byłoby to:
Następnie naciskasz klawisz numeryczny,
1
aby zobaczyć dane wyjściowe,wp-server
i naciśnij,0
aby zobaczyć dane wyjściowestart-watch
.źródło
Moje rozwiązanie jest podobne do rozwiązania Piittis, chociaż miałem problemy z używaniem systemu Windows. Musiałem więc zweryfikować pod kątem win32.
źródło
Prosty skrypt węzła, abyś mógł zacząć bez większych problemów. Używanie readline do łączenia wyników, aby linie nie były zniekształcone.
źródło
ta praca w systemie Windows
źródło