dproto 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLI.md ADDED
@@ -0,0 +1,438 @@
1
+ # dproto CLI 工具
2
+
3
+ `dproto` 是一个强大的命令行工具,用于管理和编译 Protocol Buffers 定义文件。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install -g dproto
9
+ ```
10
+
11
+ 或直接使用:
12
+
13
+ ```bash
14
+ node bin/dproto.js [command]
15
+ ```
16
+
17
+ ## 命令概览
18
+
19
+ ```bash
20
+ dproto --help
21
+ ```
22
+
23
+ 可用命令:
24
+ - `hello` - 显示欢迎信息
25
+ - `init` - 初始化新的 proto 项目
26
+ - `validate` - 验证 proto 文件语法
27
+ - `check-edit-path` - 检查并添加 Request/Response 的 path 注释
28
+
29
+ ## 配置文件
30
+
31
+ ### dproto.json
32
+
33
+ `dproto` 使用 `dproto.json` 配置文件来管理项目配置。**配置文件是必需的**,如果没有配置文件,工具会提示先初始化项目。
34
+
35
+ #### 配置文件结构
36
+
37
+ ```json
38
+ {
39
+ "apiPrefix": "/api/v1/",
40
+ "protoDir": "proto"
41
+ }
42
+ ```
43
+
44
+ #### 配置字段说明
45
+
46
+ | 字段 | 类型 | 必需 | 默认值 | 说明 |
47
+ |-----|------|------|-------|------|
48
+ | `apiPrefix` | string | 否 | `/api/v1/` | API路径前缀 |
49
+ | `protoDir` | string | **是** | `./proto` | Proto文件目录 |
50
+
51
+ #### 创建配置文件
52
+
53
+ **方式1: 使用 init 命令(推荐)**
54
+
55
+ ```bash
56
+ dproto init my-project
57
+ cd my-project
58
+ # 配置文件会自动生成
59
+ ```
60
+
61
+ **方式2: 手动创建**
62
+
63
+ 在项目根目录创建 `dproto.json` 文件:
64
+
65
+ ```json
66
+ {
67
+ "apiPrefix": "/api/v1/",
68
+ "protoDir": "proto"
69
+ }
70
+ ```
71
+
72
+ #### 配置文件优先级
73
+
74
+ 命令行参数 > 配置文件 > 默认值
75
+
76
+ ```bash
77
+ # 使用配置文件中的 protoDir
78
+ dproto validate
79
+
80
+ # 使用命令行参数(优先级更高)
81
+ dproto validate --input ./other-proto
82
+ ```
83
+
84
+ #### 配置文件检查
85
+
86
+ 运行命令时,工具会自动检查配置文件:
87
+
88
+ ```
89
+ ✅ 已加载配置文件: ./dproto.json
90
+
91
+
92
+
93
+ ❌ 配置文件不存在: ./dproto.json
94
+
95
+ 请先初始化项目:
96
+ dproto init <项目名称>
97
+
98
+ 或手动创建配置文件 dproto.json
99
+ ```
100
+
101
+ ## 命令详解
102
+
103
+ ### 1. hello - 欢迎信息
104
+
105
+ 显示工具基本信息和支持的功能。
106
+
107
+ ```bash
108
+ # 基本用法
109
+ dproto hello
110
+
111
+ # 自定义名字
112
+ dproto hello --name "Developer"
113
+ ```
114
+
115
+ ### 2. init - 初始化项目
116
+
117
+ 创建一个新的 proto 项目,包含模板文件和基础结构。
118
+
119
+ ```bash
120
+ # 创建完整模板项目
121
+ dproto init my-project
122
+
123
+ # 创建最小模板项目
124
+ dproto init my-project --template minimal
125
+
126
+ # 指定输出目录
127
+ dproto init my-project --output ./projects
128
+
129
+ # 强制覆盖现有目录
130
+ dproto init my-project --force
131
+ ```
132
+
133
+ **选项说明:**
134
+ - `<name>` - 项目名称(必填)
135
+ - `-o, --output <path>` - 输出目录(默认:项目名称)
136
+ - `-t, --template <template>` - 模板类型
137
+ - `minimal` - 最小模板(common.proto + example.proto)
138
+ - `full` - 完整模板(common.proto + user.proto + example.proto)
139
+ - `-f, --force` - 强制覆盖已存在的目录
140
+
141
+ **生成的文件:**
142
+ - `proto/` - Proto 定义目录
143
+ - `dproto.json` - **配置文件(必需)**
144
+ - `README.md` - 项目说明文档
145
+ - `package.json` - 项目配置文件
146
+
147
+ ### 3. validate - 验证 Proto 文件
148
+
149
+ 验证 proto 文件的语法和结构,检查常见问题。
150
+
151
+ ```bash
152
+ # 验证默认目录
153
+ dproto validate
154
+
155
+ # 验证指定目录
156
+ dproto validate --input ./proto
157
+
158
+ # 显示所有警告(严格模式)
159
+ dproto validate --strict
160
+ ```
161
+
162
+ **选项说明:**
163
+ - `-i, --input <path>` - 输入 proto 目录(默认:`./proto`)
164
+ - `-s, --strict` - 显示所有警告信息
165
+
166
+ **验证内容:**
167
+
168
+ 1. ✅ 基本语法检查
169
+ - syntax 声明
170
+ - package 声明
171
+ - message/service 定义
172
+
173
+ 2. ✅ 结构检查
174
+ - import 文件是否存在
175
+ - 字段编号是否重复
176
+
177
+ 3. ✅ Message 命名冲突检查(跨文件)
178
+ - 检查所有 proto 文件中的 Message 全限定名(package.MessageName)
179
+ - 防止同名 Message 在不同文件中冲突
180
+ - 基于 package 命名空间检测重复
181
+
182
+ 4. ✅ Request/Response 匹配检查(跨文件)
183
+ - 检查每个 XXXRequest 是否有对应的 XXXResponse
184
+ - 检查每个 XXXResponse 是否有对应的 XXXRequest
185
+ - 确保 API 定义完整性(一对一匹配)
186
+
187
+ 5. ✅ 最佳实践检查
188
+ - go_package 选项
189
+ - java_package 选项
190
+ - 命名规范建议
191
+
192
+ 6. ✅ protoc 语法验证(如果已安装)
193
+ - 使用 protoc 进行完整语法验证
194
+
195
+ **示例输出:**
196
+ ```
197
+ 🔍 验证 Proto 文件...
198
+
199
+ 📋 找到 5 个 proto 文件:
200
+
201
+ ✅ Request/Response 匹配成功:
202
+ 找到 15 对匹配的 Request/Response
203
+
204
+ ⚠️ Request/Response 未完整匹配:
205
+ common.proto:
206
+ • BaseResponse → 缺少 BaseRequest
207
+ • PageRequest → 缺少 PageResponse
208
+
209
+ ❌ 发现 Message 命名冲突:
210
+ user.RegisterRequest 在 2 个文件中定义:
211
+ • user2.proto (package: user)
212
+ • user1.proto (package: user)
213
+
214
+ 📝 单文件验证:
215
+
216
+ ✅ verification.proto
217
+ ✅ user.proto
218
+ ✅ password.proto
219
+ ✅ order.proto
220
+ ✅ common.proto
221
+
222
+ 🔧 使用 protoc 进行语法验证...
223
+ ✅ verification.proto - protoc 验证通过
224
+
225
+ 📊 验证总结:
226
+ ✅ 有效文件: 5/5
227
+ ⚠️ 警告数量: 9
228
+ ✨ 所有 Proto 文件验证通过!
229
+ ```
230
+
231
+ ### 4. check-edit-path - 检查并添加 Path 注释
232
+
233
+ 检查每个 Request/Response Message 是否有对应的 path 注释,如果没有则自动添加。
234
+
235
+ ```bash
236
+ # 检查默认目录
237
+ dproto check-edit-path
238
+
239
+ # 检查指定目录
240
+ dproto check-edit-path --input ./proto
241
+
242
+ # 指定 API 前缀
243
+ dproto check-edit-path --prefix /api/v2/
244
+ ```
245
+
246
+ **选项说明:**
247
+ - `-i, --input <path>` - 输入 proto 目录(默认:`./proto`)
248
+ - `-p, --prefix <prefix>` - API 路径前缀(默认:`/api/v1/`)
249
+
250
+ **功能说明:**
251
+
252
+ 1. ✅ 自动检测 Request/Response Message
253
+ - 扫描所有 proto 文件中的 `XXXRequest` 和 `XXXResponse`
254
+ - 检查每个 Message 定义前是否有 path 注释
255
+
256
+ 2. ✅ 自动计算 Path
257
+ - 根据 Message 名称自动计算对应的 API Path
258
+ - 例如: `LoginRequest` → `/api/v1/login`
259
+ - 例如: `GetUserInfoRequest` → `/api/v1/get/user/info`
260
+
261
+ 3. ✅ 自动添加注释
262
+ - 在 Message 定义前插入 path 注释
263
+ - 格式: `// /api/v1/xxx`
264
+ - 保持原有缩进和文件结构
265
+
266
+ 4. ✅ 智能跳过
267
+ - 已有正确 path 注释的 Message 会自动跳过
268
+ - 避免重复添加注释
269
+
270
+ **示例输出:**
271
+ ```
272
+ 🔍 检查 Request/Response 的 Path 注释...
273
+
274
+ API 前缀: /api/v1/
275
+ Proto 目录: ./proto
276
+
277
+ 📋 找到 5 个 proto 文件
278
+
279
+ 📝 user.proto:
280
+ ✅ 已添加 10 个注释
281
+ • RegisterRequest → /api/v1/register
282
+ • RegisterResponse → /api/v1/register
283
+ • LoginRequest → /api/v1/login
284
+ • LoginResponse → /api/v1/login
285
+
286
+ 📊 总结:
287
+ ✅ 已添加注释: 10
288
+ ⏭️ 已跳过: 0
289
+
290
+ ✨ Path 注释检查完成!
291
+ ```
292
+
293
+ **生成的注释示例:**
294
+
295
+ ```protobuf
296
+ // 登录请求
297
+ // /api/v1/login
298
+ message LoginRequest {
299
+ oneof credential {
300
+ string username = 1;
301
+ string email = 2;
302
+ string phone = 3;
303
+ }
304
+ string password = 4;
305
+ }
306
+
307
+ // 登录响应
308
+ // /api/v1/login
309
+ message LoginResponse {
310
+ common.BaseResponse base = 1;
311
+ UserInfo user_info = 2;
312
+ string token = 3;
313
+ }
314
+ ```
315
+
316
+ ## 使用流程示例
317
+
318
+ ### 创建新项目
319
+
320
+ ```bash
321
+ # 1. 初始化项目
322
+ dproto init my-api --template full
323
+
324
+ # 2. 进入项目目录
325
+ cd my-api
326
+
327
+ # 3. 验证 proto 文件
328
+ dproto validate --strict
329
+ ```
330
+
331
+ ### 现有项目验证
332
+
333
+ ```bash
334
+ # 1. 验证现有 proto 文件
335
+ dproto validate --input ./proto
336
+ ```
337
+
338
+ ## 配置 package.json
339
+
340
+ 在项目的 `package.json` 中添加脚本:
341
+
342
+ ```json
343
+ {
344
+ "scripts": {
345
+ "proto:validate": "dproto validate --input ./proto --strict"
346
+ }
347
+ }
348
+ ```
349
+
350
+ 使用 npm 脚本:
351
+
352
+ ```bash
353
+ npm run proto:validate
354
+ ```
355
+
356
+ ## 项目结构示例
357
+
358
+ ```
359
+ my-api/
360
+ ├── proto/
361
+ │ ├── common.proto # 通用定义
362
+ │ ├── user.proto # 用户模块
363
+ │ ├── verification.proto # 验证码模块
364
+ │ ├── password.proto # 密码找回模块
365
+ │ └── order.proto # 订单模块
366
+ │ └── routes.yaml # 路由配置(可选)
367
+ ├── README.md
368
+ └── package.json
369
+ ```
370
+
371
+ ## 最佳实践
372
+
373
+ 1. **定期验证** - 在修改 proto 文件后立即验证
374
+ ```bash
375
+ dproto validate --strict
376
+ ```
377
+
378
+ 2. **版本管理** - 将 proto 文件纳入 Git 管理
379
+
380
+ 3. **统一命名** - 遵循 proto3 命名规范
381
+ - message: PascalCase
382
+ - field: snake_case
383
+ - enum: UPPER_SNAKE_CASE
384
+
385
+ 4. **模块化设计** - 每个模块独立 proto 文件
386
+
387
+ 5. **自动化编译** - 使用 CI/CD 自动编译
388
+
389
+ ## 问题排查
390
+
391
+ ### protoc 未安装
392
+
393
+ ```bash
394
+ ❌ protoc 未安装
395
+
396
+ 请先安装 protoc 编译器:
397
+ • macOS: brew install protobuf
398
+ • Linux: apt-get install protobuf-compiler
399
+ • Windows: choco install protoc
400
+ ```
401
+
402
+ ### 语言插件未安装
403
+
404
+ ```bash
405
+ ⚠️ Go 插件未安装
406
+
407
+ 安装命令: go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
408
+ 确保 $GOPATH/bin 已添加到 PATH 环境变量
409
+ ```
410
+
411
+ ### 验证失败
412
+
413
+ ```bash
414
+ ❌ common.proto
415
+ • 缺少 syntax 声明
416
+ • 缺少 package 声明
417
+
418
+ ❌ 请修复上述问题后重新验证
419
+ ```
420
+
421
+ ## 版本信息
422
+
423
+ 当前版本: **1.0.0**
424
+
425
+ 支持的语言:
426
+ - Go
427
+ - Java
428
+ - Python
429
+ - PHP
430
+ - NodeJS
431
+
432
+ ## 许可证
433
+
434
+ MIT License
435
+
436
+ ## 反馈与贡献
437
+
438
+ 如有问题或建议,请提交 Issue 或 Pull Request。
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 ApiProtobuf Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,162 @@
1
+ # ApiProtobuf
2
+
3
+ > 一套 Api 使用 Protobuf 的思路方案 - 支持 JSON 和 Protobuf 二进制双格式传输
4
+
5
+ ## 🚀 快速开始 - dproto CLI 工具
6
+
7
+ 本项目提供了 `dproto` CLI 工具,用于管理和验证 Proto 文件!
8
+
9
+ ### 安装
10
+
11
+ ```bash
12
+ npm install -g dproto
13
+ ```
14
+
15
+ ### 快速使用
16
+
17
+ ```bash
18
+ # 初始化新项目
19
+ dproto init my-api
20
+
21
+ # 验证 proto 文件
22
+ dproto validate --input ./proto
23
+ ```
24
+
25
+ 📚 **完整 CLI 使用指南**: [CLI.md](CLI.md)
26
+
27
+ ---
28
+
29
+ ## 项目简介
30
+
31
+ 这是一个完整的 HTTP API Protobuf 示例项目,展示了如何在传统 HTTP API 中使用 Protocol Buffers 定义数据结构。本项目支持**双格式传输**:
32
+
33
+ - **JSON 格式** (`application/json`) - 易读易用,兼容传统 HTTP API
34
+ - **Protobuf 二进制格式** (`application/x-protobuf`) - 高效压缩,性能优化
35
+
36
+ ## 目录结构
37
+
38
+ ```
39
+ proto/
40
+ ├── common.proto # 通用定义(状态码、分页、基础响应)
41
+ ├── user.proto # 用户相关(登录、注册、用户信息)
42
+ ├── verification.proto # 验证码相关(发送、验证)
43
+ ├── password.proto # 密码找回相关(找回、重置)
44
+ ├── order.proto # 订单相关(创建、查询、管理)
45
+ └── routes.yaml # 路由配置文件(可选)
46
+
47
+ output/ # 生成的 JavaScript/TypeScript 文件
48
+ ├── protoSplit/ # 多文件方案(推荐大型项目)
49
+ │ ├── user.js # 178KB - 用户模块
50
+ │ ├── order.js # 255KB - 订单模块
51
+ │ └── *.d.ts # TypeScript 类型定义
52
+ ├── protoJs/ # 单文件方案(小型项目)
53
+ │ ├── proto.js # 490KB - CommonJS
54
+ │ └ proto.es6.js # 490KB - ES6
55
+ ├── protoJson/ # JSON 描述文件
56
+ ├── protoMin/ # 最小化版本
57
+ └── protoTs/ # TypeScript 类型定义
58
+
59
+ examples/
60
+ ├── go/server.go # Go语言示例
61
+ ├── php/ApiController.php # Laravel框架示例
62
+ ├── java/ApiController.java # Spring Boot框架示例
63
+ ├── nodejs/server.js # Express框架示例
64
+ ├── python/server.py # Flask框架示例
65
+ └── proto-usage.js # JavaScript Protobuf 使用示例
66
+ └── multi-file-usage.js # 多文件按需加载示例
67
+ ```
68
+
69
+ ## Proto 文件的作用
70
+
71
+ ### ⚠️ 重要说明
72
+
73
+ **在 HTTP JSON API 方案中,Proto 文件的主要作用是:**
74
+
75
+ 1. **定义数据结构** - 定义 Request 和 Response 消息结构
76
+ 2. **生成类型定义代码** - 为各语言生成强类型类/结构体
77
+ 3. **提供 API 文档参考** - 清晰的数据结构和字段定义
78
+ 4. **支持双格式传输** - JSON 和 Protobuf 二进制格式互转
79
+
80
+ **Proto 文件不用于:**
81
+ - ❌ 定义 HTTP 路由路径(路由在代码或配置文件中定义)
82
+ - ❌ 直接运行 RPC 调用(这是 HTTP API,不是 gRPC)
83
+ - ❌ 自动生成 HTTP 服务端代码
84
+
85
+ ### 路由定义方式
86
+
87
+ 在 HTTP API 方案中,路由通过以下方式定义:
88
+
89
+ #### 1. YAML 配置文件(可选)
90
+
91
+ 使用 [proto/routes.yaml](proto/routes.yaml) 定义路由映射:
92
+
93
+ ```yaml
94
+ routes:
95
+ - path: /users/register
96
+ method: POST
97
+ request: user.RegisterRequest
98
+ response: user.RegisterResponse
99
+ ```
100
+
101
+ #### 2. 框架路由注解(推荐)
102
+
103
+ 在代码中直接定义路由(各框架有自己的方式):
104
+
105
+ - **Laravel**: `routes/api.php`
106
+ - **Spring Boot**: `@PostMapping("/api/v1/users/register")`
107
+ - **Express**: `app.post('/api/v1/users/register', ...)`
108
+ - **Flask**: `@app.route('/api/v1/users/register', methods=['POST'])`
109
+
110
+ ---
111
+
112
+ ## 📖 详细文档
113
+
114
+ ### JavaScript/TypeScript 生成方案
115
+
116
+ **解决了大型项目(600 API / 1800 Message)的文件大小问题!**
117
+
118
+ #### 多文件方案(推荐)
119
+
120
+ ```bash
121
+ # 生成多文件,每个模块独立
122
+ npm run proto:split
123
+ ```
124
+
125
+ **优势**:
126
+ - ✅ 首屏加载减少 70%
127
+ - ✅ 按需动态加载
128
+ - ✅ Webpack/Vite 自动分割
129
+ - ✅ TypeScript 完整类型支持
130
+
131
+ **使用方式**:
132
+ ```javascript
133
+ // React/Vue 懒加载
134
+ const userProto = await import('./output/protoSplit/user.js');
135
+
136
+ // 只加载需要的模块,减少首屏加载时间
137
+ ```
138
+
139
+ #### 详细指南
140
+
141
+ - **[前端引导.md](前端引导.md)** - 前端开发者快速入门指南(React/Vue/Angular 示例)
142
+ - **[PROTO-MULTI-FILE-GUIDE.md](PROTO-MULTI-FILE-GUIDE.md)** - 多文件方案技术深度指南
143
+ - **[output/README.md](output/README.md)** - 生成的文件目录说明
144
+ - **[examples/multi-file-usage.js](examples/multi-file-usage.js)** - 多文件使用示例
145
+
146
+ ---
147
+
148
+ ### 其他文档
149
+
150
+ - **[CLI工具使用指南](CLI.md)** - dproto CLI 工具完整使用说明
151
+ - **[示例项目文档](EXAMPLES.md)** - 详细的功能模块、框架实现示例、客户端调用示例
152
+ - **[路径转换算法](Util.md)** - Message 到路径的自动转换规则
153
+
154
+ ---
155
+
156
+ ## License
157
+
158
+ MIT
159
+
160
+ ## 联系方式
161
+
162
+ 如有问题或建议,请提交 Issue 或 Pull Request。