NPM 스크립트를 순차적으로 실행


150

내가 가지고 있다고 가정 해 봅시다

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

이러한 스크립트를 모두 순차적으로 시작하기 위해 실행할 수있는 NPM 명령 사전 / 사후 수정을 사용하면 순차적으로 시작되지만 실행하기 전에 부모 스크립트가 끝날 때까지 기다리지 않습니다. 유일한 해결책은 다음과 같다고 가정합니다 : async.series 도우미 함수에서 쉘 명령을 실행할 때 Gulp 작업을 순차적으로 실행하려면 어떻게합니까? ? Gulp 로이 작업을 수행 할 수 있다는 것을 알고 있지만 NPM을 사용하여 기능을 탐색하고 싶습니다. 도움을 주셔서 감사합니다!


하단에 업데이트 된 답변
Tzach Ovadia

의 문서에 따르면 Start명령을, 당신은 사용할 수 있어야합니다 /wait매개 변수 (Start 응용 프로그램과 종료하기 위해 대기)
Tzach Ovadia

답변:


316

npm run을 통해 이러한 스크립트를 호출하고 이중 앰퍼샌드로 연결하십시오 &&.

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

설명:

  • &&순차적 실행 에는 (더블 앰퍼샌드)를 사용하십시오 .
  • &병렬 실행 에는 (단일 앰퍼샌드)를 사용하십시오 .

4
이것은 OP에서 요청한대로 previos가 완료 될 때까지 각 명령이 실행되지 않기 때문에 순서대로 실행되기 때문에 가장 효과적입니다. 감사합니다
Rice

20
&&셸에서 평가되며 Windows에서는 작동하지 않습니다.
Bernhard Döbler

12
이것은 정답이 아니어야합니다. @ BernhardDöbler에 따라 &&구문은 UNIX 구문입니다. Window 시스템에서는 제대로 작동하지 않아 빌드 프로세스에 영향을 줄 수 있습니다.
Rafe Goldberg

3
@RafeGoldberg && 연산자는 Windows와 * nix 환경에서 동일한 실행 동작 (예 : 순차 실행)을 갖습니다. 우리 모두 빠진 것이 없다면?
라이스

3
@ 쌀 오비; 멍청한 내 단일 및 이중 앰퍼샌드 및 연산자를 혼합했다. npm-run-all문서에 따르면 : "우리는 때때로 &여러 명령을 병렬로 실행하는 데 사용 하지만 Windows cmd.exe는 ...이 연산자를 지원하지 않습니다." 그래서 당신이 옳은 &&것처럼 보였습니다. 적어도 나의 간단한 연구를 통해 운영자는 완벽하게 크로스 플랫폼 호환이 가능한 것 같습니다.
Rafe Goldberg

31

Mobiletainment의 위대한 @ 다음 대답 , 당신은 또한 사용할 수 있습니다 -NPM-실행 모든 명령이 훨씬 짧은 훨씬 더 읽기 쉽게 만들 수 있습니다. 귀하의 경우 :

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

run-snpm-run-all제공된 모든 npm 스크립트를 순차적으로 실행 하는 바로 가기를 제공하므로 -s( run-s는 더 짧은 버전입니다 npm-run-all -s).


19

다른 스크립트로 문자열을 묶을 수 있습니다. "start": "pre-build && build_logic && post_build && exit"


2
나는 그들이 서로를 끝내기를 기다릴 것을 요구할 것이다. 이것들은 순차적으로 발사되지만 기다리지는 않을 것이다.
라이스

2
이것이 노드 / npm 문제라고 생각하지 않습니다. start당신이 기술적으로 윈도우에서 실행되는 명령 입니다 완성. /waitwith start를 사용하여 start내부 메소드가 완료 될 때까지 응용 프로그램을 계속 열어 두십시오.
dvlsg

이를 테스트하려면- start notepad명령 프롬프트에서 실행 한 다음 원래 명령 프롬프트를 살펴보십시오. 다른 명령을 입력 할 수 있어야합니다. 그런 다음를 실행하십시오 start /wait notepad. start당신의 메모장 창 (명령 프롬프트를 다시 살펴보고) 열려있는 동안 명령은 "실행"을 계속해야한다. 그런 다음 메모장을 닫으면 start완료됩니다.
dvlsg

\ wait 솔루션은 이중 앰퍼샌드 또는 사전 / 사후 고정 npm 명령을 통해 추가 된 명령에는 작동하지 않습니다.
라이스

15

당신은 당신의 스크립트를 앞에 수 prepost그래서 그들은 자동으로 실행됩니다 :

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

그런 다음 실행 npm run build


"사전 / 사후 수정을 사용하면 순차적으로 실행되지만 실행하기 전에 부모 스크립트가 완료 될 때까지 기다리지 않습니다."라는 질문에 표시된대로 작동하지 않습니다.
Russell Chisholm

3

당신은 시도 할 수 있습니다:


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

2

npm-run-all을 사용할 수 있습니다 다른 방법을 많이 여러 명령을 결합

예를 들어, 당신은 당신의에서 다음 스크립트를했다 package.json:

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

다음과 같이 순차적으로 실행할 수 있습니다.

$ npm-run-all clean lint build

여러 개의 npm 명령을 병렬로 실행하는 방법에 대해서는이 질문을 참조하십시오


1
이것은 갈 길입니다. npm-run-all이 최고입니다. 그리고 크로스 플랫폼 인 package.json을 생성합니다.
로버트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.