@brakebein/prisma-generator-nestjs-dto

中文文档
1.30.0发布于 2026/06/18Apache-2.0TypeScriptCommonJS近 30 天下载 3.8万

从 Prisma Schema 为 NestJS 生成 DTO 和实体类

中文使用文档
文档目录14 节
  1. 这是什么?
  2. 用法吗?
  3. 参数
  4. 说明
  5. Schema 对象说明
  6. 校验装饰
  7. 示例
  8. 原则
  9. 连接DTO
  10. 创建 DTO
  11. 更新DTO
  12. 实体
  13. 数字
  14. 许可证

Prisma 发电机 NestJS 数字交换台

Release License

  1. 这是什么?
  2. 使用量
  3. 说明
  4. 示例
  5. 原则
  6. 许可证

这是什么?

生成 ConnectDTO, (中文(简体) ), CreateDTO, (中文(简体) ), UpdateDTO, (中文(简体) ), DTO,以及 Entity 在您的 Prisma Schema 中为模型设置课。 如果您想要发挥杠杆作用, 这会很有用 打开API 在你身边 网点JS 应用程序 - 但也帮助 GraphQL 资源 。 网点JS Swagger 需要输入参数 : 要通过类描述的控制器 因为它能利用 TypeScript 所排放的元数据 Reflection 为 OpenAPI 光谱生成模型/组件。 对于控制器方法上的反应模型/组件,它也是这样.

这些课也可以与内置 验证 财务报告和审定财务报表 序列化。 。 。 .

这是叉子 @vigardit/prisma-generator-nestjs-dto (英语) 并添加多个特性:

  • 增强字段,并增加计划信息,例如描述,以生成一个 @ApiProperty() 装饰( 见 Schema 对象说明(中文(简体) )
  • 可选择添加 校验装饰
  • 支持复合类型
  • 带有额外旗帜的控制输出格式 flatResourceStructure, (中文(简体) ), noDependencies,以及 outputType
  • 可选的更美的自动格式输出

见 变化 所有改进和改变.

用法吗?

npm install --save-dev @brakebein/prisma-generator-nestjs-dto
generator nestjsDto {
  provider                        = "prisma-generator-nestjs-dto"
  output                          = "../src/generated/nestjs-dto"
  prismaClientImportPath          = ""
  outputToNestJsResourceStructure = "false"
  flatResourceStructure           = "false"
  exportRelationModifierClasses   = "true"
  reExport                        = "false"
  generateFileTypes               = "all"
  createDtoPrefix                 = "Create"
  updateDtoPrefix                 = "Update"
  dtoSuffix                       = "Dto"
  entityPrefix                    = ""
  entitySuffix                    = ""
  classValidation                 = "false"
  fileNamingStyle                 = "camel"
  noDependencies                  = "false"
  outputType                      = "class"
  definiteAssignmentAssertion     = "false"
  requiredResponseApiProperty     = "true"
  jsdoc                           = "false"
  prettier                        = "false"
  wrapRelationsAsType             = "false"
  showDefaultValues               = "false"
}

参数

所有参数都是可选的.

参数=默认值说明
output = "../src/generated/nestjs-dto"相对于您的输出路径 schema.prisma 文件
prismaClientImportPath = ""覆盖 Prisma 客户端的导入路径 。 默认为任一 @prisma/client 或基于生成器客户端输出配置的相对路径(参见 73号) (中文(简体) ).
outputToNestJsResourceStructure = "false"写入 dtos 和 entities 改为与 NestJS CRUD 生成器。资源模块名称来源于 schema.prisma
flatResourceStructure = "false"若为 outputToNestJsResourceStructure 实值 true,子文件夹 dtos 和 entities 在资源文件夹中创建。 设为 true 将平整等级.
exportRelationModifierClasses = "true"是否应该输出为DTO外地关系业务而生成的额外类别?
reExport = "false"是否应该为每个文件夹创建索引 ?
generateFileTypes = "all"all: 生成 DTO 和实体文件, dto: 只生成 DTO 文件, entity: 只生成实体文件( 无法结合复杂类型)
createDtoPrefix = "Create"词组到前缀 CreateDTO 分类
updateDtoPrefix = "Update"词组到前缀 UpdateDTO 分类
dtoSuffix = "Dto"后缀 CreateDTO 财务报告和审定财务报表 UpdateDTO 分类
entityPrefix = ""词组到前缀 Entity 分类
entitySuffix = ""后缀 Entity 分类
fileNamingStyle = "camel"如何命名生成的文件 。 有效的选择是 "camel", (中文(简体) ), "pascal", (中文(简体) ), "kebab" 财务报告和审定财务报表 "snake"。 。 。 .
classValidation = "false"从 class-validator与 noDependencies = "true" 财务报告和审定财务报表 outputType = "interface"。 。 。 .
noDependencies = "false"任何针对雀巢JS和Prisma的进口和装饰被省略,因此没有提及外部依赖。 如果您想要为前端生成适当的 DTO , 则此选项是有用的 .
outputType = "class"输出 DTO 为 class 或作为 interface。 。 。 . interface 只能用于为前端生成 DTO.
definiteAssignmentAssertion = "false"添加明确的转让断言操作员 ! ,如果 strict 和(或) strictPropertyInitialization 设定 true 在您的tsconfig。 强森的 compilerOptions。 。 。 .
requiredResponseApiProperty = "true"若为 false,添加 @ApiRequired({ required: false }) 以响应 DTO 属性。 否则,使用 required 默认总是 true 除非字段是可选的.
jsdoc = "false"添加基本的 JSDoc 部分,包含描述和默认值.
prettier = "false"将输出文件固定为更漂亮的文件 .
wrapRelationsAsType = "false"若为 true,导入关系作为解决与SWC的循环参考问题的类型(见 39号) (中文(简体) ).
showDefaultValues = "false"若为 true,使字段与 @default 默认可见属性,而不是使用 @DtoCreateOptional 财务报告和审定财务报表 @DtoUpdateOptional 每次(见 51号) (中文(简体) ).

说明

说明提供了更多信息, 帮助生成者理解您的意图 。 它们是作为 三相斜线评论 在您的 Prisma Schema 中的田间节点。 您可以对同一字段应用多条注释 .

model Post {
  /// @DtoCreateOptional
  /// @DtoUpdateHidden
  createdAt   DateTime @default(now())
  /// @DtoOverrideType(DurationLike, luxon)
  timeUntilExpires Json?
}
注释说明
@DtoReadOnly删除字段 CreateDTO 财务报告和审定财务报表 UpdateDTO
@DtoCreateHidden删除字段 CreateDTO
@DtoUpdateHidden删除字段 UpdateDTO
@DtoEntityHidden删除字段 Entity
@DtoConnectHidden删除字段 ConnectDto (适用于 @id 财务报告和审定财务报表 @unique 字段)
@DtoApiHidden添加 @ApiHideProperty 在文档中隐藏字段的装饰器, 类校验未受影响
@DtoCreateOptional添加字段 可选择 改为 CreateDTO - 用于本可省略的字段(例如:. @id, (中文(简体) ), @updatedAt(中文(简体) )
@DtoCreateRequired标记字段 所需经费 内 CreateDTO 否则是可选的——也添加了否则会被省略的字段(例如:. @id, (中文(简体) ), @updatedAt(中文(简体) )
@DtoUpdateOptional添加字段 可选择 改为 UpdateDTO - 用于本可省略的字段(例如:. @id, (中文(简体) ), @updatedAt(中文(简体) )
@DtoUpdateRequired标记字段 所需经费 内 UpdateDTO 否则是可选的——也添加了否则会被省略的字段(例如:. @id, (中文(简体) ), @updatedAt(中文(简体) )
@DtoRelationRequired标记关系 所需经费 内 Entity 尽管在PrismaSchema中它是可选的 - 在您不想要时有用( SQL) ON DELETE CASCADE 行为 - 但您的逻辑数据计划视此关系为必要( )说明: 一次过时 优惠行动 释放和稳定)
@DtoRelationCanCreateOnCreate添加 创建 选项 CreateDTO - 允许创建相关模式实例时有用
@DtoRelationCanConnectOnCreate添加 连接 选项 CreateDTO - 当您想要/需要连接到已有相关实例时有用
@DtoRelationCanCreateOnUpdate添加 创建 选项 UpdateDTO - 允许创建相关模式实例时有用
@DtoRelationCanConnectOnUpdate添加 连接 选项 UpdateDTO - 当您想要/需要连接到已有相关实例时有用
@DtoRelationCanUpdateOnUpdate添加 更新 选项 UpdateDTO - 当您想要/需要更新现有相关实例时有用, 仅适用于“ 一对一” 关系
@DtoRelationCanDisconnectOnUpdate添加 断开 选项 UpdateDTO - 当您想要/需要断开已有相关实例时有用
@DtoRelationIncludeId包含因其他原因被省略的关系字段的ID(使用代替 CanCreate编号 :CanConnect 说明,如果你只是想通过 IDs)
@DtoTypeFullUpdate在生成时 UpdateDTO,使用 CreateDTO 组合类型,以强制完全替换旧值(见 2号(中文(简体) )
@DtoOverrideType(...)在所有生成的实体中,强制为这个领域提供某种类型。 如果需要将Json 字段投放到读取/写入时特别有用 。 注意,您必须提供至少一个参数,并且可以在 (...) 使用此注释 - 第一种是用于此字段的要强制的类型名称, 第二和第三可以用于添加一个 import 用于实体文件顶端的该类型。 例如:
  • @DtoOverrideType(MyType) 将球场投出 MyType 但是不添加导入
  • @DtoOverrideType(MyType, some-package) 将球场投出 MyType 添加 import {MyType} from "some-package"
  • @DtoOverrideType(MyType, ../types, default) 将投出并添加 import MyType from "../types"
  • @DtoOverrideType(MyTypeInterface, ../types, MyType) 将变成 MyTypeInterface 添加 import {MyType as MyTypeInterface} from "../types"
@DtoOverrideApiPropertyType(...)与 @DtoOverrideType 不过 @ApiProperty() type 属性
@DtoCreateValidateIf(...)添加 @ValidateIf(...) 字段的装饰符 CreateDTO (计: 条件验证 (按等级验证)
@DtoUpdateValidateIf(...)添加 @ValidateIf(...) 字段的装饰符 UpdateDTO (计: 条件验证 (按等级验证)

Schema 对象说明

与 @nestjs/swagger,您可以从代码中生成 API 规格. 路由,请求机构,查询参数等都附有特制装饰. 属性可以附加注释 @ApiProperty() 添加 schema 对象信息的装饰符 . 运行时将部分添加,然后包括 type, (中文(简体) ), nullable等 (中文(简体) ). 但需要人工添加描述等补充信息.

如果使用这样的生成器, 任何自定义 @ApiProperty() 在更新DTO时,注释将被推翻. 添加前缀的 schema 属性 @ 改为上页的评论部分.

目前,支持以下计划属性:

  • description
  • minimum
  • maximum
  • exclusiveMinimum
  • exclusiveMaximum
  • minLength
  • maxLength
  • minItems
  • maxItems
  • example

此外,还推断和说明特殊数据类型:

  • Int: { type: 'integer', format: 'int32' }
  • BigInt: { type: 'integer', format: 'int64' }
  • Float: { type: 'number', format: 'float' }
  • Decimal: { type: 'number', format: 'double' }
  • DateTime: { type: 'string', format: 'date-time' }

示例

使用 @description 财务报告和审定财务报表 @minimum 标记

/// @description Number of reviews
/// @minimum 9
reviewCount Int     @default(0)

将生成 @ApiProperty() 装饰器 description 财务报告和审定财务报表 minimum 财产,以及 type 财务报告和审定财务报表 format 以指定数据类型.

@ApiProperty({
  description: 'Number of reviews',
  minimum: 9,
  type: 'integer',
  format: 'int32',
})
reviewCount: number;

默认值在 CreateDTO 财务报告和审定财务报表 UpdateDTO。 。 。 . 然而,一个领域有一个 @default() 属性默认隐藏于 CreateDTO 财务报告和审定财务报表 UpdateDTO, (中文(简体) ), 因此,需要 @DtoCreateOptional 和(或) @DtoUpdateOptional 将在场.

校验装饰

若为 classValidation = "true",生成器将会从 类验证器 改为每个字段 CreateDTO 财务报告和审定财务报表 UpdateDTO 然后可以与雀巢JS结合使用 ValidationPipe (见 NestJS 自动验证) (中文(简体) ).

一些装饰会从字段的属性推断出来. 如果字段是可选的,将添加 @IsOptional(),否则 @IsNotEmpty()。 。 。 . 如果字段是一个列表, 它会添加 @IsArray()。 。 。 . 从字段类型推断出类型验证符 :

  • String → @IsString()
  • Boolean → @IsBoolean()
  • Int → @IsInt()
  • BigInt → @IsInt()
  • Float: → @IsNumber()
  • Decimal: → @IsDecimal()
  • DateTime → @IsDateString()

其余 校验装饰 可在字段上方的评论/文档部分中添加. 如果不传递一个值,则可以省略括号.

示例

普里斯马斯克马

/// @Contains('Product')
name        String   @db.VarChar(255)
reviewCount Int      @default(0)
/// @ArrayNotEmpty
tags        String[]
score       Float?

生成输出

@IsNotEmpty()
@IsString()
@Contains('Product')
name: string;
@IsOptional()
@IsInt()
reviewCount?: number;
@IsNotEmpty()
@IsArray()
@ArrayNotEmpty()
tags: string[];
@IsOptional()
@IsNumber()
score?: number;

示例

普里斯马斯克马
generator nestjsDto {
  provider = "prisma-generator-nestjs-dto"
  output = "../src"
  outputToNestJsResourceStructure = "true"
}

model Question {
  id          String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
  /// @DtoReadOnly
  createdAt   DateTime @default(now())
  /// @DtoRelationRequired
  createdBy   User? @relation("CreatedQuestions", fields: [createdById], references: [id])
  createdById String? @db.Uuid
  updatedAt   DateTime @updatedAt
  /// @DtoRelationRequired
  updatedBy   User? @relation("UpdatedQuestions", fields: [updatedById], references: [id])
  updatedById String? @db.Uuid

  /// @DtoRelationRequired
  /// @DtoRelationCanConnectOnCreate
  category   Category? @relation(fields: [categoryId], references: [id])
  categoryId String?   @db.Uuid

  /// @DtoCreateOptional
  /// @DtoRelationCanCreateOnCreate
  /// @DtoRelationCanConnectOnCreate
  /// @DtoRelationCanCreateOnUpdate
  /// @DtoRelationCanConnectOnUpdate
  tags Tag[]

  title     String
  content   String
  responses Response[]
}
生成结果
// src/question/dto/connect-question.dto.ts
export class ConnectQuestionDto {
  id: string;
}
// src/question/dto/create-question.dto.ts
import { ApiExtraModels } from '@nestjs/swagger';
import { ConnectCategoryDto } from '../../category/dto/connect-category.dto';
import { CreateTagDto } from '../../tag/dto/create-tag.dto';
import { ConnectTagDto } from '../../tag/dto/connect-tag.dto';

export class CreateQuestionCategoryRelationInputDto {
  connect: ConnectCategoryDto;
}
export class CreateQuestionTagsRelationInputDto {
  create?: CreateTagDto[];
  connect?: ConnectTagDto[];
}

@ApiExtraModels(
  ConnectCategoryDto,
  CreateQuestionCategoryRelationInputDto,
  CreateTagDto,
  ConnectTagDto,
  CreateQuestionTagsRelationInputDto,
)
export class CreateQuestionDto {
  category: CreateQuestionCategoryRelationInputDto;
  tags?: CreateQuestionTagsRelationInputDto;
  title: string;
  content: string;
}
// src/question/dto/update-question.dto.ts
import { ApiExtraModels } from '@nestjs/swagger';
import { CreateTagDto } from '../../tag/dto/create-tag.dto';
import { ConnectTagDto } from '../../tag/dto/connect-tag.dto';

export class UpdateQuestionTagsRelationInputDto {
  create?: CreateTagDto[];
  connect?: ConnectTagDto[];
}

@ApiExtraModels(CreateTagDto, ConnectTagDto, UpdateQuestionTagsRelationInputDto)
export class UpdateQuestionDto {
  tags?: UpdateQuestionTagsRelationInputDto;
  title?: string;
  content?: string;
}
// src/question/entities/question.entity.ts
import { User } from '../../user/entities/user.entity';
import { Category } from '../../category/entities/category.entity';
import { Tag } from '../../tag/entities/tag.entity';
import { Response } from '../../response/entities/response.entity';

export class Question {
  id: string;
  createdAt: Date;
  createdBy?: User;
  createdById: string;
  updatedAt: Date;
  updatedBy?: User;
  updatedById: string;
  category?: Category;
  categoryId: string;
  tags?: Tag[];
  title: string;
  content: string;
  responses?: Response[];
}

原则

通常我们从 DMMF.Field 提供的资料 @prisma/generator-helper由于有些情况并不十分清楚,我们还要检查是否有其他 说明 (或 decorators在田间 documentation (这是任何作为 三相斜线评论 在你的田间 prisma.schema) (中文(简体) ).

起初,我们想要 DTO 类改为 implement Prisma.<ModelName><(Create|Update)>Input 但结果却与 所需经费 关系字段.

连接DTO

这种DTO代表了在试图从外部(如REST API消费者)期望得到的输入数据的结构 connect 通过关系字段到模型.

A 类 Model编号 ConnectDTO 类由独一无二的列表组成 isId 财务报告和审定财务报表 isUnique 斯伽罗地. 如果 ConnectDTO 类别有完全一个财产,财产按要求标出。 如果有多个属性,所有属性都是可选的(因为设置其中的一个属性已经足以进行独特的查询) - 但是,您必须指定至少一个属性 .

ConnectDTOs 用于关系字段 CreateDTOs 和 UpdateDTO编号.

创建 DTO

这种DTO代表了在试图从外部(如REST API消费者)期望得到的输入数据的结构 create 新实例 Model。 。 。 . 通常,对数据库计划的要求与我们希望允许用户做的事情不同. 举例来说(这就是这个生成器所表达的观点),我们认为关系平面字段不应该被用户曝光,因为 create, (中文(简体) ), update,或 delete 活动(在PrismaClient中生成的TypeScript类型也排除这些字段)。 但是,如果您的计划定义了必要的关系,如果没有关系数据,创建该模型的实体将变得相当困难. 在某些情况下,您可以从上下文中获取相关实例的信息(例如,剩余端点上的HTTP路径) /api/post/:postid/comment 创建 Comment (a) 关于 Post) (中文(简体) ). 对于其他案件,我们掌握了

  • @DtoRelationCanCreateOnCreate
  • @DtoRelationCanConnectOnCreate
  • @DtoRelationCanCreateOnUpdate
  • @DtoRelationCanConnectOnUpdate

说明 生成相应的输入属性 CreateDTO 财务报告和审定财务报表 UpdateDTO (可选择的或需要的----取决于关系的性质).

当生成一个 Model编号 CreateDTO class, 符合下列任何条件的字段被省略(命令事项:

  • isReadOnly OR 附加说明 @DtoReadOnly (单位:千美元)说明: 这显然包括关系平板字段)
  • 字段代表关系( y)field.kind === 'object',不附加注释 @DtoRelationCanCreateOnCreate 或者说 @DtoRelationCanConnectOnCreate
  • 字段为 a 关系平面
  • 字段没有附加注释 @DtoCreateOptional 和
    • isId && hasDefaultValue (id字段不应由用户提供)
    • isUpdatedAt (单位:千美元)普里斯马 将输入值)
    • isRequired && hasDefaultValue (对于空出时会回落到默认值的计程字段). 以为: createdAt 时间戳 @default(now()) (见 现在( )页:1

更新DTO

当生成一个 Model编号 UpdateDTO class, 符合下列任何条件的字段被省略(命令事项:

  • 字段附加注释 @DtoUpdateOptional
  • isReadOnly OR 附加说明 @DtoReadOnly (单位:千美元)说明: 这显然包括关系平板字段)
  • isId (id字段不应由用户更新)
  • 字段代表关系( y)field.kind === 'object',不附加注释 @DtoRelationCanCreateOnUpdate 或者说 @DtoRelationCanConnectOnUpdate
  • 字段为 a 关系平面
  • 字段没有附加注释 @DtoUpdateOptional 和
    • isId (id字段不应由用户更新)
    • isUpdatedAt (单位:千美元)普里斯马 将输入值)
    • isRequired && hasDefaultValue (对于空出时会回落到默认值的计程字段). 以为: createdAt 时间戳 @default(now()) (见 现在( )页:1

实体

当生成一个 Model编号 Entity 类别,仅附加注释的字段 @DtoEntityHidden 被删除. 其他所有领域都只被操控 isRequired 财务报告和审定财务报表 isNullable 旗帜.

默认情况下,一个实体的每个平面字段都是 required 意思是它没有获得 TypeScript “ 可选成员旗帜 ” ? 旁边是名字 PrismaSchema 中标为可选字段的字段被视为 nullable - 意思是他们的TypeScript类型是: field.type 财务报告和审定财务报表 null (例如:. string | null) (中文(简体) ).

关系和 关系平面 字段受到不同的对待。 如果你不具体的话 include a 在您的查询中,这些字段将不存在.

  • 每个关系字段总是可选的(isRequired = false(中文(简体) )
  • 关系无效,除非
    • 关系字段为一对多或多对多(即列表)类型(如果找不到相關相關紀錄会返回空陣列)
    • 该关系最初按要求标出(isRequired = true(中文(简体) )
    • 关系字段 @DtoRelationRequired (当你在 PrismaSchema 中将一个关系标为可选关系时这样做,因为你不希望(SQL)) ON DELETE CASCADE 行为 - 但你的逻辑数据方案视此关系为必要)
  • 默认值不添加到 @ApiProperty() 装饰

数字

平原上 DTO 类几乎与 Entity ,区别是所有关系字段被省略. 如果您的回应是没有任何(可选的)关系的平庸实体,则此反应是有用的 .

许可证

所有文件均在 Apache 许可证 2.0。 。 。 .

版本与发布记录

@brakebein/prisma-generator-nestjs-dto 共发布 71 个版本,首次发布于 2022/03/16;过去 12 个月发布了 3 个版本。

版本发布日期距今
1.30.0latest2026/06/184 个月前
1.29.02025/12/1310 个月前
1.29.0-beta0beta2025/12/0111 个月前
1.28.12025/06/051.4 年前
1.28.02025/05/181.5 年前
1.27.02025/03/281.6 年前

关于 @brakebein/prisma-generator-nestjs-dto 的常见问题

@brakebein/prisma-generator-nestjs-dto 是什么?

从 Prisma Schema 为 NestJS 生成 DTO 和实体类

如何安装 @brakebein/prisma-generator-nestjs-dto?

在项目目录运行 npm install @brakebein/prisma-generator-nestjs-dto,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@prisma/client(^5.16.0 || ^6.0.0 || ^7.0.0)、prisma(^5.16.0 || ^6.0.0 || ^7.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。它还提供命令行工具 prisma-generator-nestjs-dto,可以用 npx prisma-generator-nestjs-dto 直接运行。

@brakebein/prisma-generator-nestjs-dto 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@brakebein/prisma-generator-nestjs-dto 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@brakebein/prisma-generator-nestjs-dto 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=14。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@brakebein/prisma-generator-nestjs-dto 可以商用吗?

@brakebein/prisma-generator-nestjs-dto 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@brakebein/prisma-generator-nestjs-dto 的下载量有多少?

根据 npm 官方下载统计,@brakebein/prisma-generator-nestjs-dto 在 2026/10/09 – 2026/11/07 这 30 天内被下载 37,737 次,日均约 1,258 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@brakebein/prisma-generator-nestjs-dto 还在维护吗?

最新版本 1.30.0 发布于 2026/06/18(4 个月前);至今共发布 71 个版本,其中过去 12 个月发布了 3 个;首次发布于 2022/03/16。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。