如何在不启动NestJS服务的情况下生成Swagger JSON文件
存在无需启动NestJS HTTP服务即可生成Swagger JSON的成熟方案,你已经写好的@nestjs/swagger装饰器标注不需要做任何修改,具体实现方式如下:
官方原生方案(推荐)
@nestjs/swagger本身就内置了脱离HTTP服务生成文档的能力,不需要额外安装依赖,可以完全复用你项目里现有的Swagger配置逻辑:
- 新建独立生成脚本,例如
scripts/generate-swagger.ts - 脚本内仅初始化Nest应用上下文,不调用
listen()方法启动端口监听,直接生成Swagger文档对象后写入本地文件即可
参考代码:
import { NestFactory } from '@nestjs/core'; import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'; import { AppModule } from '../src/app.module'; import * as fs from 'node:fs'; async function run() { // 初始化Nest应用容器,不绑定端口、不启动对外服务 const app = await NestFactory.create(AppModule, { logger: false }); // 复用你项目里原有的Swagger配置即可 const swaggerConfig = new DocumentBuilder() .setTitle('项目API文档') .setVersion('1.0') .build(); const swaggerDoc = SwaggerModule.createDocument(app, swaggerConfig); // 将生成的JSON结构写入本地文件 fs.writeFileSync('./swagger.json', JSON.stringify(swaggerDoc, null, 2)); await app.close(); } run();
在package.json中添加执行脚本:"gen:swagger": "ts-node scripts/generate-swagger.ts",运行该命令即可直接在项目根目录得到完整的Swagger JSON文件。
这个方案本质是只加载Nest依赖注入容器、读取所有装饰器元数据,不会启动网络监听,执行速度快,和你启动服务后访问/api-json拿到的内容完全一致。
第三方CLI工具方案
如果不想手写生成脚本,可以使用专门的静态生成工具:
- 支持
nestjs-swagger-cli这类命令行工具,静态扫描项目中的控制器、DTO和Swagger装饰器元数据,不需要初始化Nest应用上下文,生成速度更快,支持输出JSON、YAML两种格式的规范文件。 - 注意:如果你的项目存在大量动态模块、自定义元数据逻辑,优先选择官方原生方案,静态扫描工具可能出现元数据识别遗漏的问题。
提示:如果需要在CI/CD流程中自动生成文档,官方原生方案的兼容性最好,不需要额外适配服务启动的端口检测、健康检查逻辑。
内容的提问来源于stack exchange,提问作者sroool
相关产品推荐
相关产品推荐

