Skip to content

🅰️ Angular CLI — Angular

⬅️ Volver al índice de comandos

🅰️ Herramientas de Angular (globales con npm)

ComandoQué haceEjemplo
npm install -g typescriptInstala el compilador de TypeScript (tsc)tsc -v
npm install -g @angular/cliInstala el CLI de Angular (ng)ng version
tsc -vVersión de TypeScripttsc -v
ng versionVersión de Angular CLI + Node + gestor de paquetesng version

💡 Si ng da command not found, es que falta instalar @angular/cli globalmente.

🧩 Desglose de npm i -g @angular/cli

npm  i  -g  @angular/cli
 │   │   │       │
 │   │   │       └── paquete a instalar: el Angular CLI (la herramienta `ng`)
 │   │   └────────── -g = global: disponible en TODO el sistema, no en un proyecto
 │   └────────────── i  = abreviatura de "install"
 └────────────────── npm = el gestor que realiza la instalación
  • i es lo mismo que install (npm install -g @angular/cli es idéntico).
  • -g (global) significa que ng queda disponible desde cualquier carpeta de tu terminal. Sin -g, el paquete solo se instalaría dentro de un proyecto concreto.
  • Es algo que se hace una sola vez por máquina (o cuando quieras actualizar el CLI).
  • Si vuelves a correrlo y ya estaba instalado, npm lo actualiza a la última versión (verás changed N packages).

💡 Local vs global: -g se usa para herramientas que quieres usar en toda la máquina (como ng o tsc). Las librerías de un proyecto (Angular, RxJS…) se instalan sin -g, para que queden guardadas en ese proyecto y en su package.json.

🔍 Cómo leer la salida de ng version

Angular CLI       : 21.2.17        ← versión del CLI (la herramienta `ng`)
Node.js           : 20.19.4        ← Node que está usando ahora mismo
Package Manager   : yarn 1.22.22   ← gestor con el que instalará dependencias
Operating System  : darwin arm64   ← tu SO (macOS en chip Apple Silicon)
  • Angular CLI = versión de la herramienta ng, no del framework. El framework (@angular/core) tendrá su propia versión dentro de cada proyecto.
  • Node.js = debe estar dentro del rango recomendado (ver tabla más abajo).
  • Package Manager = el gestor que usará ng new para instalar dependencias.

⚠️ Ojo con el Package Manager: si dice yarn y tú trabajas con npm, al hacer ng new el CLI instalará con yarn. Para forzar npm: ng new mi-app --package-manager npm o fíjalo global con ng config -g cli.packageManager npm.

💡 La instalación global con npm i -g @angular/cli termina con un resumen tipo changed 277 packages in 21s. Eso es normal: confirma que se instaló/actualizó bien.

🏗️ Generar código (ng generate / ng g)

ComandoQué haceEjemplo
ng generate component <nombre> (o ng g c <nombre>)Crea un componente nuevo: .ts, .html, .css, .spec.tsng g c productos
ng generate service <nombre> (o ng g s <nombre>)Crea un servicio nuevo (@Injectable), sin HTML/CSS (no tiene vista)ng g s auth
ng generate guard <nombre> (o ng g guard <nombre>)Crea un Route Guard — pregunta interactivamente qué tipong g guard auth

💡 ng g es el alias corto de ng generate — hacen exactamente lo mismo.

📦 ng g c (componente) — ejemplo y resultado

bash
ng g c productos
CREATE src/app/productos/productos.css (0 bytes)
CREATE src/app/productos/productos.spec.ts (552 bytes)
CREATE src/app/productos/productos.ts (198 bytes)
CREATE src/app/productos/productos.html (24 bytes)

productos.ts queda con este esqueleto (standalone por defecto desde Angular 17+):

ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-productos',
  imports: [],
  templateUrl: './productos.html',
  styleUrl: './productos.css',
})
export class Productos {}

💡 Para generarlo dentro de una carpeta (p. ej. agrupado bajo dashboard/): ng g c dashboard/perfil → crea src/app/dashboard/perfil/perfil.ts (y el resto).

⚙️ ng g s (servicio) — ejemplo y resultado

bash
ng g s auth
CREATE src/app/auth.spec.ts (351 bytes)
CREATE src/app/auth.ts (65 bytes)
  • Un servicio no trae .html/.css (no tiene vista propia) — solo .ts y su test.
ts
// auth.ts (esqueleto que deja el CLI)
import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class Auth {}

📌 providedIn: 'root' ya viene puesto por defecto — el servicio queda listo como singleton global sin tocar app.config.ts.

🛡️ ng g guard <nombre> — elegir el tipo de guard

Al correrlo, el CLI pregunta con checkboxes qué tipo(s) de guard crear:

? Which type of guard would you like to create?
❯◉ CanActivate
 ◯ CanActivateChild
 ◯ CanDeactivate
 ◯ CanMatch
TipoCuándo se ejecutaUso típico
CanActivateAntes de entrar a una rutaBloquear acceso si no está logueado
CanActivateChildAntes de entrar a una ruta hijaProteger todas las sub-rutas de una sección de una sola vez
CanDeactivateAntes de salir de una rutaConfirmar "¿Salir sin guardar?" en un formulario
CanMatchAntes de que el router decida si la ruta aplicaSimilar a CanActivate, pero puede dejar que el router pruebe otra ruta con el mismo path

Ejemplo real, seleccionando CanActivate:

bash
ng g guard auth
# ? Which type of guard would you like to create? CanActivate
CREATE src/app/auth-guard.spec.ts (458 bytes)
CREATE src/app/auth-guard.ts (134 bytes)

auth-guard.ts queda con este esqueleto (hay que completar la lógica a mano):

ts
import { CanActivateFn } from '@angular/router';

export const authGuard: CanActivateFn = (route, state) => {
  return true;
};
  • El nombre del archivo es <nombre>-guard.ts (no <nombre>.guard.ts), y la función exportada se llama <nombre>Guard (camelCase) — en este caso authGuard.
  • Con CanDeactivate seleccionado en vez de CanActivate, el esqueleto trae el tipo CanDeactivateFn y una función que recibe la instancia del componente como primer parámetro, en vez de (route, state).
  • Ver el uso real de CanActivate y CanDeactivate (con el código completo, ya funcionando) en routing-avanzado.md.

🚩 Flags útiles al generar

FlagQué haceEjemploResultado
--implements=<Tipo>Elige el tipo de guard sin que pregunte interactivong g guard auth --implements=CanActivateGenera directo con CanActivateFn, sin el menú de checkboxes
--no-interactiveSalta cualquier pregunta interactiva, usa los defaults/flags dadosng g guard auth --implements=CanActivate --no-interactiveIdeal para scripts/automatización — no se queda esperando input
--skip-testsNo genera el archivo .spec.tsng g c productos --skip-testsSolo crea .ts, .html, .css (3 archivos en vez de 4)
--dry-runMuestra qué archivos crearía, sin crearlosng g c productos --dry-runMismo listado de CREATE ..., pero ningún archivo se toca en disco

📐 Versiones de Node por versión de Angular

AngularNode recomendado
Angular 1718.13+ o 20.9+
Angular 1818.19+ o 20.11+
Angular 19 / 2020.11+ o 22.x
Angular 2120.19+ o 22.12+

💡 Flujo típico al empezar el curso:

bash
nvm install --lts          # instalar LTS
nvm use --lts              # usarla
nvm alias default --lts    # dejarla por defecto
node -v && npm -v          # verificar