How can I run multiple npm scripts in parallel?

后端 未结 22 2111
灰色年华
灰色年华 2020-11-22 05:48

In my package.json I have these two scripts:

  \"scripts\": {
    \"start-watch\": \"nodemon run-babel index.js\",
    \"wp-server\": \"webpack-         


        
相关标签:
22条回答
  • 2020-11-22 06:27

    You should use npm-run-all (or concurrently, parallelshell), because it has more control over starting and killing commands. The operators &, | are bad ideas because you'll need to manually stop it after all tests are finished.

    This is an example for protractor testing through npm:

    scripts: {
      "webdriver-start": "./node_modules/protractor/bin/webdriver-manager update && ./node_modules/protractor/bin/webdriver-manager start",
      "protractor": "./node_modules/protractor/bin/protractor ./tests/protractor.conf.js",
      "http-server": "./node_modules/http-server/bin/http-server -a localhost -p 8000",
      "test": "npm-run-all -p -r webdriver-start http-server protractor"
    }
    

    -p = Run commands in parallel.

    -r = Kill all commands when one of them finishes with an exit code of zero.

    Running npm run test will start Selenium driver, start http server (to serve you files) and run protractor tests. Once all tests are finished, it will close the http server and the selenium driver.

    0 讨论(0)
  • 2020-11-22 06:27

    In a package.json in the parent folder:

    "dev": "(cd api && start npm run start) & (cd ../client && start npm run start)"
    

    this work in windows

    0 讨论(0)
  • 2020-11-22 06:28

    I've checked almost all solutions from above and only with npm-run-all I was able to solve all problems. Main advantage over all other solution is an ability to run script with arguments.

    {
      "test:static-server": "cross-env NODE_ENV=test node server/testsServer.js",
      "test:jest": "cross-env NODE_ENV=test jest",
      "test": "run-p test:static-server \"test:jest -- {*}\" --",
      "test:coverage": "npm run test -- --coverage",
      "test:watch": "npm run test -- --watchAll",
    }
    

    Note run-p is shortcut for npm-run-all --parallel

    This allows me to run command with arguments like npm run test:watch -- Something.

    EDIT:

    There is one more useful option for npm-run-all:

     -r, --race   - - - - - - - Set the flag to kill all tasks when a task
                                finished with zero. This option is valid only
                                with 'parallel' option.
    

    Add -r to your npm-run-all script to kill all processes when one finished with code 0. This is especially useful when you run a HTTP server and another script that use the server.

      "test": "run-p -r test:static-server \"test:jest -- {*}\" --",
    
    0 讨论(0)
  • 2020-11-22 06:29

    I ran into problems with & and |, which exit statuses and error throwing, respectively.

    Other solutions want to run any task with a given name, like npm-run-all, which wasn't my use case.

    So I created npm-run-parallel that runs npm scripts asynchronously and reports back when they're done.

    So, for your scripts, it'd be:

    npm-run-parallel wp-server start-watch

    0 讨论(0)
提交回复
热议问题