Navigation

Node.js

npm-run-all2: Execute Multiple Scripts Efficiently (2025)

Learn how npm-run-all2 streamlines JavaScript development by running multiple npm scripts simultaneously or sequentially with simple commands. Boost your workflow today!

Table Of Contents

Introduction

As JavaScript developers, we constantly juggle multiple development tasks - starting servers, running watchers, executing linters, and compiling code. Managing these processes individually can be tedious and error-prone, especially when working on complex projects that require several scripts to run simultaneously or in a specific sequence.

Enter npm-run-all2, a powerful cross-platform tool that solves this exact problem. Whether you need to start multiple development servers at once or execute a series of build steps in order, npm-run-all2 provides an elegant solution that works seamlessly across macOS, Linux, and Windows environments.

In this comprehensive guide, you'll discover how to leverage npm-run-all2 to streamline your development workflow, reduce manual intervention, and create more efficient build processes that save time and prevent errors.

What is npm-run-all2?

npm-run-all2 is a maintained fork of the original npm-run-all package, designed to execute multiple npm scripts either in parallel or sequentially using simple, intuitive commands. Unlike shell-specific solutions or editor-dependent tasks, npm-run-all2 provides a platform-independent approach that ensures consistent behavior across different operating systems.

The tool serves as a drop-in replacement for the original npm-run-all package, offering the same core functionality while providing ongoing maintenance and updates. This makes it an ideal choice for modern JavaScript projects that require reliable script orchestration.

Key Benefits of npm-run-all2

Cross-Platform Compatibility: Works identically on macOS, Linux, and Windows without requiring platform-specific modifications or workarounds.

Simple Command Structure: Provides intuitive commands that are easy to remember and implement in any project.

Flexible Execution Models: Supports both parallel and sequential script execution depending on your specific requirements.

Advanced Configuration Options: Offers powerful flags for fine-tuning script behavior, including race modes, error handling, and concurrency limits.

Installation and Migration

Installing npm-run-all2

For new projects that haven't used the original npm-run-all:

npm install --save-dev npm-run-all2

Or if you prefer using Yarn:

yarn add --dev npm-run-all2

Migrating from npm-run-all

If you're currently using the original npm-run-all package, migration is straightforward:

# Remove the old package
npm remove npm-run-all

# Install the new maintained version
npm install --save-dev npm-run-all2

The migration process is seamless because npm-run-all2 maintains complete compatibility with the original package's API, meaning your existing scripts will continue to work without any modifications.

Core Commands and Usage Patterns

npm-run-all2 provides three primary commands that cover different execution scenarios:

run-p: Parallel Execution

The run-p command executes multiple scripts simultaneously, making it perfect for scenarios where you need independent processes running concurrently.

Basic Parallel Execution Example:

{
  "scripts": {
    "frontend": "cd frontend && npm run dev",
    "backend": "cd backend && npm run start:dev",
    "database": "docker-compose up postgres",
    "start:dev": "run-p frontend backend database"
  }
}

When you execute npm run start:dev, all three services start simultaneously, creating a complete development environment with a single command.

Real-World Development Server Example:

{
  "scripts": {
    "serve:api": "node server/index.js",
    "serve:client": "webpack-dev-server --mode=development",
    "watch:styles": "sass --watch src/styles:dist/css",
    "watch:tests": "jest --watch",
    "dev": "run-p serve:* watch:*"
  }
}

This configuration demonstrates the power of glob patterns, where serve:* and watch:* automatically include all scripts that match those patterns.

run-s: Sequential Execution

The run-s command executes scripts one after another, ensuring each completes before the next begins. This approach is essential for build processes where order matters.

Build Pipeline Example:

{
  "scripts": {
    "clean": "rimraf dist",
    "format": "prettier --write src/**/*.{js,ts,jsx,tsx}",
    "lint": "eslint src --ext .js,.ts,.jsx,.tsx --fix",
    "type-check": "tsc --noEmit",
    "compile": "webpack --mode=production",
    "build": "run-s clean format lint type-check compile"
  }
}

This sequence ensures your code is properly cleaned, formatted, linted, type-checked, and compiled in the correct order.

Testing Pipeline Example:

{
  "scripts": {
    "test:unit": "jest --coverage",
    "test:integration": "cypress run",
    "test:e2e": "playwright test",
    "security:audit": "npm audit --audit-level moderate",
    "test:all": "run-s test:unit test:integration test:e2e security:audit"
  }
}

npm-run-all: Advanced Configurations

The main npm-run-all command provides the most flexibility, allowing you to mix parallel and sequential execution with advanced options.

Mixed Execution Example:

npm-run-all --parallel serve:* --sequential test:unit test:integration

This command runs all serve scripts in parallel while executing tests sequentially.

Advanced Features and Configuration

Using Glob Patterns

Glob patterns allow you to target multiple scripts dynamically:

{
  "scripts": {
    "build:js": "webpack --entry=./src/js/index.js",
    "build:css": "sass src/styles/main.scss dist/css/main.css",
    "build:assets": "copyfiles src/assets/* dist/",
    "build:all": "run-p build:*"
  }
}

Error Handling with --continue-on-error

By default, npm-run-all2 stops execution when a script fails. Use the --continue-on-error flag to continue running other scripts:

{
  "scripts": {
    "test:unit": "jest",
    "test:lint": "eslint src",
    "test:type": "tsc --noEmit",
    "test:all": "run-p --continue-on-error test:*"
  }
}

Controlling Concurrency with --max-parallel

Limit the number of scripts running simultaneously to prevent resource exhaustion:

{
  "scripts": {
    "process:data1": "node scripts/process-data1.js",
    "process:data2": "node scripts/process-data2.js",
    "process:data3": "node scripts/process-data3.js",
    "process:data4": "node scripts/process-data4.js",
    "process:all": "run-p --max-parallel 2 process:*"
  }
}

Race Mode with --race

Use race mode to stop all scripts when the first one completes:

{
  "scripts": {
    "test:chrome": "karma start --browsers Chrome",
    "test:firefox": "karma start --browsers Firefox",
    "test:safari": "karma start --browsers Safari",
    "test:quick": "run-p --race test:*"
  }
}

Print Labels for Better Output

Add the --print-label flag to identify which script produces which output:

{
  "scripts": {
    "start:dev": "run-p --print-label frontend backend"
  }
}

Real-World Implementation Examples

Full-Stack Development Environment

{
  "scripts": {
    "db:start": "docker-compose up -d postgres redis",
    "api:dev": "nodemon server/index.js",
    "client:dev": "vite dev",
    "worker:dev": "nodemon worker/index.js",
    "dev": "run-s db:start && run-p api:dev client:dev worker:dev"
  }
}

Comprehensive CI/CD Pipeline

{
  "scripts": {
    "install:deps": "npm ci",
    "security:audit": "npm audit --audit-level high",
    "format:check": "prettier --check src/**/*.{js,ts,jsx,tsx}",
    "lint:check": "eslint src --ext .js,.ts,.jsx,.tsx",
    "type:check": "tsc --noEmit",
    "test:unit": "jest --coverage --watchAll=false",
    "test:integration": "cypress run --headless",
    "build:prod": "webpack --mode=production",
    "ci": "run-s install:deps security:audit format:check lint:check type:check test:unit test:integration build:prod"
  }
}

Microservices Development

{
  "scripts": {
    "service:auth": "cd services/auth && npm run dev",
    "service:user": "cd services/user && npm run dev",
    "service:order": "cd services/order && npm run dev",
    "service:payment": "cd services/payment && npm run dev",
    "gateway": "cd api-gateway && npm run dev",
    "infrastructure": "docker-compose up -d",
    "dev:services": "run-p service:*",
    "dev:all": "run-s infrastructure && run-p gateway dev:services"
  }
}

Performance Optimization and Best Practices

Optimizing Script Performance

Group Related Scripts: Organize scripts logically to minimize context switching and improve readability.

Use Appropriate Execution Mode: Choose parallel execution for independent tasks and sequential execution for dependent operations.

Limit Concurrency: Use --max-parallel to prevent overwhelming system resources, especially on development machines with limited capabilities.

Implement Smart Error Handling: Use --continue-on-error judiciously - only when script failures shouldn't halt the entire process.

Memory and Resource Management

When running multiple resource-intensive scripts simultaneously, consider these strategies:

{
  "scripts": {
    "build:heavy": "run-p --max-parallel 2 build:js build:css build:assets build:images",
    "test:memory": "run-s --continue-on-error test:unit test:integration test:e2e"
  }
}

Cross-Platform Considerations

Ensure your scripts work across different operating systems:

{
  "scripts": {
    "clean:unix": "rm -rf dist",
    "clean:windows": "rimraf dist",
    "clean": "rimraf dist",
    "prebuild": "npm run clean"
  }
}

Troubleshooting Common Issues

Script Doesn't Start

Problem: Scripts fail to execute or hang indefinitely.

Solution: Check script paths and ensure all dependencies are properly installed. Verify that individual scripts work when run separately.

Output Mixing Issues

Problem: Output from multiple scripts becomes difficult to read.

Solution: Use the --print-label flag to clearly identify which script produces which output:

run-p --print-label frontend backend

Resource Exhaustion

Problem: System becomes unresponsive when running multiple scripts.

Solution: Implement concurrency limits and monitor resource usage:

run-p --max-parallel 3 script:*

Platform-Specific Failures

Problem: Scripts work on one operating system but fail on others.

Solution: Use cross-platform compatible tools and commands. Replace platform-specific commands with universal alternatives like rimraf instead of rm -rf.

Error Handling in CI/CD

Problem: Build pipeline fails when one script encounters an error.

Solution: Implement appropriate error handling strategies based on your requirements:

{
  "scripts": {
    "test:critical": "run-s test:unit test:integration",
    "test:optional": "run-p --continue-on-error test:accessibility test:performance"
  }
}

Frequently Asked Questions

What's the difference between npm-run-all and npm-run-all2?

npm-run-all2 is a maintained fork of the original npm-run-all package. While they offer identical functionality and API compatibility, npm-run-all2 receives regular updates and bug fixes, making it the recommended choice for new projects.

Can I mix parallel and sequential execution in a single command?

Yes, you can use the main npm-run-all command with specific flags to combine execution modes. For example: npm-run-all --parallel serve:* --sequential test:unit test:integration runs all serve scripts in parallel, then executes tests sequentially.

How do I handle scripts that never terminate (like development servers)?

When using parallel execution with long-running scripts like development servers, the process will continue running until you manually stop it (Ctrl+C). This is the expected behavior for development environments where you want multiple services running simultaneously.

What happens if one script fails in parallel mode?

By default, if any script fails in parallel mode, npm-run-all2 will terminate all running scripts. Use the --continue-on-error flag if you want other scripts to continue running despite individual failures.

Can I use npm-run-all2 with scripts that require user input?

Scripts requiring user input can cause issues in parallel execution. It's recommended to run interactive scripts individually or use sequential execution when user input is required.

How do I debug issues with specific scripts?

Use the --print-label flag to identify which script produces which output. You can also run individual scripts separately to isolate and debug specific issues before combining them with npm-run-all2.

Conclusion

npm-run-all2 transforms how you manage complex development workflows by providing a simple, reliable way to orchestrate multiple npm scripts. Whether you're running development servers in parallel, executing build pipelines sequentially, or creating sophisticated CI/CD processes, this tool offers the flexibility and reliability modern JavaScript projects demand.

The key benefits you've learned include cross-platform compatibility, intuitive command structure, advanced configuration options, and powerful error handling capabilities. By implementing these patterns in your projects, you'll reduce manual intervention, minimize errors, and create more efficient development workflows.

Key takeaways to remember:

  • Use run-p for independent tasks that can run simultaneously
  • Use run-s for dependent tasks that must run in sequence
  • Leverage glob patterns to target multiple scripts dynamically
  • Implement appropriate error handling with --continue-on-error
  • Control resource usage with --max-parallel limits

Ready to streamline your development workflow? Start by implementing npm-run-all2 in your current project and share your experience in the comments below. What script orchestration challenges are you facing that npm-run-all2 could help solve?

Share this article

Add Comment

No comments yet. Be the first to comment!

More from Node.js