Skip to content

Instantly share code, notes, and snippets.

@vagnerlandio
Created May 23, 2023 13:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vagnerlandio/a7de958b5274c6143c12d386c5a61e4c to your computer and use it in GitHub Desktop.
Save vagnerlandio/a7de958b5274c6143c12d386c5a61e4c to your computer and use it in GitHub Desktop.
Separate and organize multiple projects build commands defined in a single package.json file

If you have a large number of Angular projects and defining individual build commands for each project in the package.json file becomes unwieldy, you can consider using a different approach to organize your build commands. Here are a few suggestions:

  1. Create a separate configuration file: Instead of cluttering your package.json file with multiple build commands, you can create a separate configuration file (e.g., angular-projects.json) to store the build configurations for each project. In this file, you can define an array of objects, where each object represents a project and its corresponding build command.

Example angular-projects.json:

[
  {
    "name": "ProjectA",
    "command": "ng build --project projectA"
  },
  {
    "name": "ProjectB",
    "command": "ng build --project projectB"
  },
  ...
]

Then, you can create a single generic build command in your package.json file that reads the configuration file and executes the appropriate build command based on a parameter.

Example package.json:

"scripts": {
  "build": "node build.js"
}

Example build.js:

const projects = require('./angular-projects.json');
const project = process.argv[2];

if (project) {
  const selectedProject = projects.find(p => p.name === project);
  if (selectedProject) {
    console.log(`Building ${selectedProject.name}`);
    // Execute the build command for the selected project
    execSync(selectedProject.command, { stdio: 'inherit' });
  } else {
    console.error(`Project '${project}' not found.`);
  }
} else {
  console.error('Please specify a project to build.');
}

Now, you can run npm run build ProjectA or npm run build ProjectB to build the desired project.

  1. Automate the configuration generation: If you have a large number of projects, it might be cumbersome to manually maintain the configuration file. Instead, you can write a script to automatically generate the configuration file based on a predefined project structure or a list of project directories.

Example generate-config.js:

const fs = require('fs');
const projectsDir = './projects';
const projects = [];

fs.readdirSync(projectsDir).forEach(dir => {
  // Customize the command based on your project directory structure
  const command = `ng build --project ${dir}`;
  projects.push({ name: dir, command });
});

fs.writeFileSync('angular-projects.json', JSON.stringify(projects, null, 2));

This script reads the directories within a specified projectsDir and generates the angular-projects.json configuration file automatically.

You can run node generate-config.js to update the configuration file whenever you add or remove projects.

  1. Use a build automation tool: Another option is to leverage a build automation tool like Grunt, Gulp, or Webpack to manage and execute your build commands. These tools provide more flexibility and advanced configuration options, allowing you to define tasks and workflows for multiple projects.

You can create a configuration file for the build tool (e.g., Gruntfile.js for Grunt) and define tasks for each project. These tasks can encapsulate the build command and any additional configurations or dependencies specific to the project.

Using a build automation tool requires some setup and learning curve, but it can be beneficial for managing complex build workflows and handling large numbers of projects.

By adopting one of these approaches, you can organize and manage a large number of Angular projects without cluttering your package.json file or sacrificing readability.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment