Maison >interface Web >js tutoriel >CLI TypeScript: Automatiser la construction et le déploiement des scripts

CLI TypeScript: Automatiser la construction et le déploiement des scripts

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-27 20:31:20218parcourir

Je voudrais suivre mon article précédent sur les clis TypeScript. Voici comment je veux continuer: je prévois d'implémenter la commande build pour créer une application VITE et la commande Deploy pour déployer l'application sur Amazon S3 et AWS CloudFront.

CLI TypeScript: Automatiser la construction et le déploiement des scripts

Création d'une CLI TypeScript pour votre monorepo

Chris Cook ・ 1 décembre 24

#manuscrit #javascript #webdev #programmation

Nous utiliserons List2 comme coureur de tâche pour définir les étapes nécessaires pour créer et déployer l'application. Nous utiliserons EXECA pour exécuter les commandes CLI pour Vite et AWS. Puisque nous exécutons du code TypeScript, nous pourrions utiliser les API programmatiques au lieu des commandes CLI, mais gardons les choses simples!

#!/usr/bin/env -S pnpm tsx
import chalk from 'chalk';
import { Command } from 'commander';
import { Listr } from 'listr2';
import { $ } from 'execa';

interface Ctx {
  command: 'build' | 'deploy';
}

const tasks = new Listr<ctx>(
  [
    /**
     * Build tasks
     */
    {
      enabled: (ctx) => ctx.command === 'build' || ctx.command === 'deploy',
      title: 'Build',
      task: (ctx, task): Listr =>
        task.newListr<ctx>([
          /**
           * Runs `vite build`.
           */
          {
            title: `Run ${chalk.magenta('vite build')}`,
            task: async (ctx, task): Promise<void> => {
              const cmd = $({ all: true })`vite build`;
              cmd.all.pipe(task.stdout());

              await cmd;

              task.output = `Build completed: ${chalk.dim('./dist')}`;
            },
            rendererOptions: { persistentOutput: true },
          },
        ]),
    },
    /**
     * Deploy tasks
     */
    {
      enabled: (ctx) => ctx.command === 'deploy',
      title: 'Deploy',
      task: (ctx, task): Listr =>
        task.newListr<ctx>([
          /**
           * Runs `aws s3 sync`.
           */
          {
            title: `Run ${chalk.magenta('aws s3 sync')}`,
            task: async (ctx, task): Promise<void> => {
              const build = './dist';
              const bucket = 's3://my-bucket';

              const cmd = $({ all: true })`aws s3 sync ${build} ${bucket} --delete`;
              cmd.all.pipe(task.stdout());

              await cmd;

              task.output = `S3 sync completed: ${chalk.dim(bucket)}`;
            },
            rendererOptions: { persistentOutput: true },
          },
          /**
           * Runs `aws cloudfront create-invalidation`.
           */
          {
            title: `Run ${chalk.magenta('aws cloudfront create-invalidation')}`,
            task: async (ctx, task): Promise<void> => {
              const distributionId = 'E1234567890ABC';

              const cmd = $({ all: true })`aws cloudfront create-invalidation --distribution-id ${distributionId} --paths /* --no-cli-pager`;
              cmd.all.pipe(task.stdout());

              await cmd;

              task.output = `CloudFront invalidation completed: ${chalk.dim(distributionId)}`;
            },
            rendererOptions: { persistentOutput: true },
          },
        ]),
    },
  ],
  {
    rendererOptions: {
      collapseSubtasks: false,
    },
  },
);

const program = new Command()
  .name('monorepo')
  .description('CLI for Monorepo')
  .version('1.0.0');

program
  .command('build')
  .description('Build the monorepo')
  .action(async () => {
    await tasks.run({ command: 'build' });
  });

program
  .command('deploy')
  .description('Deploy the monorepo')
  .action(async () => {
    await tasks.run({ command: 'deploy' });
  });

await program.parseAsync(process.argv);
</void></void></ctx></void></ctx></ctx>

Les tâches sont divisées en tâches de construction et de déploiement des tâches. Étant donné que le déploiement nécessite une étape de construction, nous utilisons la propriété activée pour activer conditionnellement les tâches en fonction de la construction ou du déploiement de la commande CLI. Chaque tâche exécute la commande CLI correspondante et tue sa sortie vers la console.

Enregistrez ce script sous CLI.ts et exécutez-le avec PNPM TSX CLI:

CLI TypeScript: Automatiser la construction et le déploiement des scripts

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:De javascript à cArticle suivant:De javascript à c