作为 NestJS 开发者,你有没有过这样的经历?
手动创建users模块 → 新建users.controller.ts→ 复制粘贴基础路由 → 修改类名 → 注册到模块……一套操作下来,10 分钟没了,还容易写错@Controller的前缀!😩
别慌!NestJS CLI就是来拯救你的——它是 Nest 生态的“效率引擎”,用命令行搞定 90%的重复工作:项目初始化、组件生成、开发调试、构建部署,全流程自动化!
今天这篇指南,从基础命令到高级玩法,把 NestJS CLI 的所有功能讲透,帮你彻底告别“手动搬砖”的日子~
一、先搞懂:NestJS CLI 到底是什么?
NestJS CLI 不是简单的“脚手架工具”,而是全生命周期开发平台——它的核心设计哲学是「约定优于配置」:
- 生成的
Module会自动注册到AppModule; - 生成的
Controller会自动加路由前缀; - 自动生成测试文件(可选);
- 统一代码结构,避免团队成员“各自为战”。
简单说:CLI 帮你做“重复的事”,你只需要做“核心的事”(比如写业务逻辑)。
二、基础命令:从 0 到 1 创建 Nest 项目
2.1 初始化项目:一行命令建完整框架
最常用的命令就是nest new——用它创建项目,比手动建文件夹快 10 倍!
示例:创建基础项目
nest new my-nest-app # 创建名为my-nest-app的项目运行后,CLI 会问你选包管理器(npm/yarn/pnpm),选好后自动完成:
- 下载依赖;
- 生成标准化目录结构;
- 初始化 Git 仓库(可选)。
生成的项目结构长这样:
my-nest-app/
├── src/ # 源码根目录
│ ├── app.controller.ts # 默认控制器(处理请求)
│ ├── app.service.ts # 默认服务(业务逻辑)
│ ├── app.module.ts # 根模块(组织所有组件)
│ └── main.ts # 入口文件(启动应用)
├── test/ # 测试目录
├── nest-cli.json # CLI配置文件(核心!)
└── package.json # 依赖配置2.2 核心生成命令:快速创建组件
NestJS 的核心组件(Module/Controller/Service 等),都能通过nest generate(缩写nest g)命令生成!
高频命令清单(必背)
| 组件类型 | 命令(完整) | 命令(缩写) | 说明 |
|---|---|---|---|
| 模块 | nest generate module users | nest g mo users | 创建用户模块 |
| 控制器 | nest generate controller users | nest g co users | 创建用户控制器(带路由) |
| 服务 | nest generate service users | nest g s users | 创建用户服务(业务逻辑) |
| 中间件 | nest generate middleware logger | nest g mi logger | 创建日志中间件 |
| 守卫 | nest generate guard auth | nest g gu auth | 创建权限守卫 |
| 管道 | nest generate pipe validation | nest g pi validation | 创建参数验证管道 |
示例:生成用户模块+控制器+服务
# 1. 创建用户模块(自动生成UsersModule)
nest g mo users
# 2. 创建用户控制器(自动注册到UsersModule)
nest g co users --no-spec # --no-spec:不生成测试文件
# 3. 创建用户服务(自动注册到UsersModule)
nest g s users --no-spec生成的users.controller.ts会自动带基础路由:
import { Controller, Get } from '@nestjs/common'
@Controller('users') // 路由前缀:/users
export class UsersController {
@Get() // 处理GET /users请求
findAll() {
return 'This action returns all users'
}
}三、nest-cli.json:定制你的 CLI 行为
nest-cli.json 是 CLI 的“配置中心”,你可以通过它调整生成规则、编译器选项、静态资源处理。
3.1 核心配置项解析
看一个常用配置示例(注释版):
{
"$schema": "https://json.schemastore.org/nest-cli", // 配置schema(语法提示)
"collection": "@nestjs/schematics", // 使用Nest官方Schematics(生成器模板)
"sourceRoot": "src", // 源码根目录(默认是src)
"compilerOptions": {
"deleteOutDir": true, // 构建前删除dist目录(避免旧文件缓存)
"assets": [
// 处理静态资源(比如.env、.json)
{
"include": "**/*.env", // 包含所有.env文件
"outDir": "./dist", // 复制到dist目录
"watchAssets": true // 监视文件变化(开发模式下自动同步)
}
],
"plugins": [
// 集成第三方插件(比如Swagger)
{
"name": "@nestjs/swagger",
"options": {
"dtoKeyOfComment": "description", // 用DTO的注释生成Swagger描述
"controllerKeyOfComment": "summary" // 用Controller的注释生成Swagger摘要
}
}
]
},
"generateOptions": {
"spec": true, // 默认生成测试文件(.spec.ts)
"flat": false // 生成组件时创建目录(比如users模块会生成users文件夹)
}
}3.2 实用配置技巧
- 关闭测试文件:如果不想生成
.spec.ts,可以加--no-spec参数,或修改generateOptions.spec: false; - 扁平化结构:如果不想生成组件目录(比如
users.controller.ts直接放在src下),加--flat参数; - 处理静态资源:如果有
.env、.proto等文件需要打包到 dist,一定要配置assets!
四、高级玩法:让 CLI 更懂你的团队
4.1 自定义生成模板:统一代码风格
如果你的团队有统一代码规范(比如 Controller 必须带 Swagger 装饰器),可以自定义生成模板!
步骤 1:创建自定义模板
- 新建模板目录(比如
~/.nest-templates/rest-controller); - 写模板文件
__name__.controller.ts(用 EJS 语法):
import { Controller, Get, Post, Body } from '@nestjs/common';
import { ApiTags, ApiOperation } from '@nestjs/swagger'; // 团队要求加Swagger
@ApiTags('<%= dasherize(name) %>') // 自动生成API标签(比如users→"users")
@Controller('<%= dasherize(name) %>') // 自动加路由前缀
export class <%= classify(name) %>Controller { // 自动生成类名(比如users→UsersController)
@Get()
@ApiOperation({ summary: '查询所有<%= name %>' }) // 自动加接口描述
findAll() {
return `返回所有<%= name %>`;
}
@Post()
@ApiOperation({ summary: '创建<%= name %>' })
create(@Body() data: any) {
return `创建${name}成功`;
}
}步骤 2:用自定义模板生成组件
nest g co users --template rest-controller # 使用自定义模板生成控制器生成的users.controller.ts会自动带 Swagger 装饰器,不用手动写!是不是超省心?😎
4.2 多项目工作区(Monorepo):管理多个应用
如果你的项目是微服务架构(比如有api和admin两个应用),可以用 CLI 的Monorepo模式:
步骤 1:创建 Monorepo 项目
nest new my-monorepo --package-manager pnpm # 用pnpm管理依赖(推荐)步骤 2:添加子项目
# 添加API应用(处理接口)
nest generate app api
# 添加Admin应用(后台管理)
nest generate app admin
# 添加共享库(比如通用工具)
nest generate lib shared步骤 3:配置 nest-cli.json
{
"monorepo": true, // 开启Monorepo模式
"projects": {
"api": {
"type": "application", // 应用类型
"root": "apps/api", // 根目录
"sourceRoot": "apps/api/src" // 源码目录
},
"admin": {
"type": "application",
"root": "apps/admin"
},
"shared": {
"type": "library", // 库类型(可共享)
"root": "libs/shared"
}
}
}五、开发最佳实践:用 CLI 提升效率
5.1 标准开发流程:从功能到接口
用 CLI 开发新功能的标准步骤:
- 建模块:
nest g mo features/users(用户模块); - 建实体:
nest g class features/users/entities/user.entity(对应数据库表); - 建 DTO:
nest g class features/users/dto/create-user.dto(创建用户的参数); - 建服务:
nest g s features/users/services/users(业务逻辑); - 建控制器:
nest g co features/users/controllers/users(处理请求)。
5.2 调试技巧:用 VSCode 断点调试
想调试 Nest 应用?只需两步:
- 启动开发服务器(带调试模式):
nest start --debug --watch # --watch:热重载;--debug:开启调试- 配置 VSCode 的
launch.json:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Debug Nest",
"runtimeExecutable": "nest",
"args": ["start", "--debug", "--watch"],
"console": "integratedTerminal",
"restart": true, // 代码变化时自动重启
"autoAttachChildProcesses": true // 自动附加子进程
}
]
}按F5启动调试,就能在 Controller/Service 里加断点,一步步看代码执行流程~
六、常见问题:踩过的坑都帮你填了
6.1 全局安装 CLI 报错(权限问题)
如果安装时遇到EACCES: permission denied:
# 解决方案1:用--unsafe-perm选项
npm install -g @nestjs/cli --unsafe-perm
# 解决方案2:用nvm管理Node版本(推荐)
nvm install 18 # 安装Node 18
nvm use 18 # 使用Node 18
npm install -g @nestjs/cli6.2 生成器找不到路径
如果生成组件时提示“路径不存在”:
nest g mo modules/users # 报错:Path "modules/users" does not exist解决方案:
- 确保路径在
sourceRoot下(默认是src),比如用src/modules/users:
nest g mo src/modules/users- 或者修改
nest-cli.json的sourceRoot为src(默认就是,不用改)。
七、写在最后:CLI 是 Nest 开发的“效率引擎”
NestJS CLI 不是“可选工具”,而是“必学技能”——它能帮你:
- 减少重复劳动(不用手动创建文件、注册模块);
- 统一代码风格(团队成员用同一套模板);
- 提升开发效率(把时间放在核心业务上)。
如果你是 Nest 新手,先掌握nest new、nest g mo、nest g co、nest g s这几个基础命令;
如果是老鸟,可以尝试自定义模板、开发 Schematics,让 CLI 更符合团队需求。
最后送你一句话:用 CLI 少写一行代码,就多一份时间去喝咖啡~ ☕
(注:文中命令基于 Nest CLI v10.x,不同版本可能有差异,建议用nest --version检查当前版本~)
- 本文链接:https://fridolph.top/posts/2025-09-10__nest02-cli
- 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 许可协议。