@tq1086/urpf-cli 1.0.0 → 2.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.
Files changed (3) hide show
  1. package/dist/index.js +4369 -1207
  2. package/package.json +64 -63
  3. package/readme.md +424 -631
package/readme.md CHANGED
@@ -1,631 +1,424 @@
1
- # URPF CLI 工具
2
-
3
- 基于 URPF (Universal Resource Package Format) v1.0 规范的命令行打包工具。
4
-
5
- ## 项目链接
6
-
7
- - **首页**: https://gitcode.com/tq1086/urpf-cli
8
- - **仓库**: git@gitcode.com:tq1086/urpf-cli.git
9
- - **问题反馈**: https://gitcode.com/tq1086/urpf-cli/issues
10
-
11
- ## 功能特性
12
- - ✅ 将文件或目录打包成 URPF 格式
13
- - ✅ URPF 文件中解包资源到文件系统
14
- - ✅ 向已有 URPF 包添加文件或目录
15
- - ✅ URPF 包中移除文件(支持变量替换)
16
- - ✅ 支持 `.gitignore` 风格的忽略规则
17
- - ✅ 自动检测文件编码和换行符类型
18
- - ✅ 保留文件权限和元数据
19
- - ✅ 跨平台支持(Windows、Linux、macOS)
20
-
21
- ## 安装
22
-
23
- ```bash
24
- # 全局安装
25
- npm install -g @tq1086/urpf-cli
26
-
27
- # 本地安装
28
- npm install @tq1086/urpf-cli
29
- ```
30
-
31
- ## 使用方法
32
-
33
- ### 基本用法
34
-
35
- #### 打包命令 (pack)
36
-
37
- ```bash
38
- # 打包单个文件
39
- urpf-cli pack package.json
40
-
41
- # 打包目录
42
- urpf-cli pack src/
43
-
44
- # 指定输出路径
45
- urpf-cli pack src/ -o output.urpf
46
-
47
- # 显示详细日志
48
- urpf-cli pack src/ -v
49
- ```
50
-
51
- #### 解包命令 (unpack)
52
-
53
- ```bash
54
- # 解包到当前目录
55
- urpf-cli unpack package.urpf
56
-
57
- # 解包到指定目录
58
- urpf-cli unpack package.urpf -o ./output
59
-
60
- # 显示详细日志
61
- urpf-cli unpack package.urpf -v
62
-
63
- # 强制覆盖已存在的文件
64
- urpf-cli unpack package.urpf --force
65
-
66
- # 仅当源文件更新时才覆盖
67
- urpf-cli unpack package.urpf --force-when-newer
68
- ```
69
-
70
- #### 添加文件命令 (pack-add)
71
-
72
- ```bash
73
- # 向已有 URPF 包添加单个文件
74
- urpf-cli pack-add package.urpf newfile.txt
75
-
76
- # 向已有 URPF 包添加目录
77
- urpf-cli pack-add package.urpf newdir/
78
-
79
- # 不递归扫描子目录
80
- urpf-cli pack-add package.urpf newdir/ --no-recurse
81
-
82
- # 显示详细日志
83
- urpf-cli pack-add package.urpf newfile.txt -v
84
-
85
- # 使用自定义忽略规则
86
- urpf-cli pack-add package.urpf newdir/ -i .myignore
87
- ```
88
-
89
- #### 移除文件命令 (pack-remove)
90
-
91
- ```bash
92
- # 从 URPF 包中移除单个文件
93
- urpf-cli pack-remove package.urpf oldfile.txt
94
-
95
- # 支持通配符匹配
96
- urpf-cli pack-remove package.urpf "old*.txt"
97
-
98
- # 支持问号通配符
99
- urpf-cli pack-remove package.urpf "file?.txt"
100
-
101
- # 使用变量替换
102
- urpf-cli pack-remove package.urpf "${root}/config.json"
103
-
104
- # 不应用变量替换
105
- urpf-cli pack-remove package.urpf "${root}/config.json" --no-apply-variables
106
-
107
- # 显示详细日志
108
- urpf-cli pack-remove package.urpf oldfile.txt -v
109
- ```
110
-
111
- ### 命令选项
112
-
113
- #### pack 命令选项
114
-
115
- | 选项 | 描述 | 默认值 |
116
- | :--- | :--- | :--- |
117
- | `-o, --output <path>` | 输出文件路径 | 输入路径.urpf |
118
- | `-v, --verbose` | 显示详细日志 | false |
119
- | `-i, --ignore <path>` | 指定忽略规则文件 | 自动检测 .gitignore/.iflowignore |
120
- | `-f, --follow-symlinks` | 跟随符号链接 | false |
121
- | `-d, --max-depth <number>` | 最大扫描深度(0 表示无限制) | 0 |
122
- | `--no-recurse` | 不递归扫描子目录 | false |
123
- | `--force` | 强制覆盖已存在的输出文件 | false |
124
-
125
- #### unpack 命令选项
126
-
127
- | 选项 | 描述 | 默认值 |
128
- | :--- | :--- | :--- |
129
- | `-o, --output <path>` | 输出目录路径 | 当前目录 |
130
- | `-v, --verbose` | 显示详细日志 | false |
131
- | `--force` | 强制覆盖已存在的文件 | false |
132
- | `--force-when-newer` | 仅当源文件比目标文件更新时才覆盖 | false |
133
- | `--preserve-mtime` | 保留原始修改时间 | false |
134
-
135
- #### pack-add 命令选项
136
-
137
- | 选项 | 描述 | 默认值 |
138
- | :--- | :--- | :--- |
139
- | `-v, --verbose` | 显示详细日志 | false |
140
- | `-i, --ignore <path>` | 指定忽略规则文件 | 自动检测 .gitignore/.iflowignore |
141
- | `-f, --follow-symlinks` | 跟随符号链接 | false |
142
- | `-d, --max-depth <number>` | 最大扫描深度(0 表示无限制) | 0 |
143
- | `--no-recurse` | 不递归扫描子目录 | false |
144
-
145
- #### pack-remove 命令选项
146
-
147
- | 选项 | 描述 | 默认值 |
148
- | :--- | :--- | :--- |
149
- | `-v, --verbose` | 显示详细日志 | false |
150
- | `--no-apply-variables` | 不应用变量替换 | true |
151
-
152
- ### 使用示例
153
-
154
- #### 示例 1:打包项目目录
155
-
156
- ```bash
157
- urpf-cli pack ./my-project -o my-project.urpf -v
158
- ```
159
-
160
- 输出:
161
- ```
162
- ✅ URPF 文件已生成: my-project.urpf
163
- 文件数量: 42
164
- 目录数量: 8
165
- 跳过文件: 5
166
- URPF 大小: 123456 字节
167
- 执行耗时: 234ms
168
- ```
169
-
170
- #### 示例 2:使用自定义忽略规则
171
-
172
- ```bash
173
- urpf-cli pack ./src -o src.urpf -i .myignore -v
174
- ```
175
-
176
- #### 示例 3:打包单个文件
177
-
178
- ```bash
179
- urpf-cli pack config.json -o config.urpf
180
- ```
181
-
182
- #### 示例 4:不递归扫描子目录
183
-
184
- ```bash
185
- urpf-cli pack ./src --no-recurse -o src-top-level.urpf
186
- ```
187
-
188
- 此命令只打包 `src` 目录的顶层文件,不包含子目录。
189
-
190
- #### 示例 5:强制覆盖已存在的文件
191
-
192
- ```bash
193
- urpf-cli pack ./my-project -o my-project.urpf --force
194
- ```
195
-
196
- 如果 `my-project.urpf` 已存在,使用 `--force` 选项会强制覆盖它。
197
-
198
- ### 解包示例
199
-
200
- #### 示例 1:基本解包
201
-
202
- ```bash
203
- urpf-cli unpack my-project.urpf
204
- ```
205
-
206
- 输出:
207
- ```bash
208
- ✅ URPF 文件已解包到: /current/directory
209
- 创建: 42
210
- 覆盖: 0
211
- 跳过: 0
212
- 总字节: 123456
213
- 执行耗时: 234ms
214
- ```
215
-
216
- #### 示例 2:解包到指定目录
217
-
218
- ```bash
219
- urpf-cli unpack my-project.urpf -o ./extracted
220
- ```
221
-
222
- #### 示例 3:强制覆盖已存在的文件
223
-
224
- ```bash
225
- # 第一次解包
226
- urpf-cli unpack my-project.urpf -o ./output
227
-
228
- # 修改一些文件
229
- echo "modified" > ./output/somefile.txt
230
-
231
- # 第二次解包(不使用 --force 会失败)
232
- urpf-cli unpack my-project.urpf -o ./output
233
- # 错误: 文件已存在: somefile.txt。请使用 --force 选项强制覆盖,或使用 --force-when-newer 选项仅覆盖更新的文件。
234
-
235
- # 使用 --force 强制覆盖
236
- urpf-cli unpack my-project.urpf -o ./output --force
237
- ```
238
-
239
- #### 示例 4:仅覆盖更新的文件
240
-
241
- ```bash
242
- urpf-cli unpack my-project.urpf -o ./output --force-when-newer -v
243
- ```
244
-
245
- 输出:
246
- ```bash
247
- 已创建: ./output/newfile.txt
248
- 跳过(目标文件更新): ./output/oldfile.txt
249
- 跳过(目标文件更新): ./output/anotherfile.txt
250
- ✅ URPF 文件已解包到: ./output
251
- 创建: 1
252
- 覆盖: 0
253
- 跳过: 2
254
- 总字节: 1024
255
- 执行耗时: 123ms
256
- ```
257
-
258
- #### 示例 5:保留原始修改时间
259
-
260
- ```bash
261
- urpf-cli unpack my-project.urpf -o ./output --preserve-mtime
262
- ```
263
-
264
- ### 添加文件示例
265
-
266
- #### 示例 1:添加单个文件到 URPF
267
-
268
- ```bash
269
- # 创建初始 URPF 包
270
- urpf-cli pack ./my-project -o my-project.urpf
271
-
272
- # 添加新文件
273
- urpf-cli pack-add my-project.urpf newfile.txt
274
- ```
275
-
276
- 输出:
277
- ```bash
278
- ✅ 已成功添加文件到 URPF 包: my-project.urpf
279
- 添加文件: 1
280
- 跳过文件: 0
281
- 总字节: 1024
282
- 执行耗时: 123ms
283
- ```
284
-
285
- #### 示例 2:添加目录到 URPF 包
286
-
287
- ```bash
288
- urpf-cli pack-add my-project.urpf ./new-module/
289
- ```
290
-
291
- #### 示例 3:不递归添加目录
292
-
293
- ```bash
294
- urpf-cli pack-add my-project.urpf ./new-module/ --no-recurse
295
- ```
296
-
297
- 此命令只添加 `new-module` 目录的顶层文件,不包含子目录。
298
-
299
- #### 示例 4:使用自定义忽略规则
300
-
301
- ```bash
302
- urpf-cli pack-add my-project.urpf ./new-module/ -i .myignore -v
303
- ```
304
-
305
- ### 移除文件示例
306
-
307
- #### 示例 1:移除单个文件
308
-
309
- ```bash
310
- urpf-cli pack-remove my-project.urpf oldfile.txt
311
- ```
312
-
313
- 输出:
314
- ```bash
315
- ✅ 已成功从 URPF 包移除文件: my-project.urpf
316
- 移除文件: 1
317
- 未找到: 0
318
- 执行耗时: 89ms
319
- ```
320
-
321
- #### 示例 2:使用通配符移除多个文件
322
-
323
- ```bash
324
- # 移除所有 .log 文件
325
- urpf-cli pack-remove my-project.urpf "*.log"
326
-
327
- # 移除所有以 old 开头的文件
328
- urpf-cli pack-remove my-project.urpf "old*"
329
- ```
330
-
331
- #### 示例 3:移除子目录中的文件
332
-
333
- ```bash
334
- urpf-cli pack-remove my-project.urpf "subdir/oldfile.txt"
335
- ```
336
-
337
- #### 示例 4:使用变量替换
338
-
339
- 首先,创建一个包含变量定义的 URPF 文件:
340
-
341
- ```bash
342
- # 创建 URPF 文件(假设包含属性部分)
343
- urpf-cli pack ./my-project -o my-project.urpf
344
- ```
345
-
346
- 然后,使用变量替换移除文件:
347
-
348
- ```bash
349
- # 移除 ${root}/config.json
350
- urpf-cli pack-remove my-project.urpf "${root}/config.json" -v
351
- ```
352
-
353
- 输出:
354
- ```bash
355
- Variable replacement: ${root}/config.json -> subdir/config.json
356
- Successfully removed 1 files: my-project.urpf
357
- Removed files:
358
- - file://subdir/config.json
359
- Not found count: 0
360
- Duration: 123ms
361
- ```
362
-
363
- #### 示例 5:处理不存在的文件
364
-
365
- ```bash
366
- urpf-cli pack-remove my-project.urpf nonexistent.txt
367
- ```
368
-
369
- 输出:
370
- ```bash
371
- 已成功从 URPF 包移除文件: my-project.urpf
372
- 移除文件: 0
373
- 未找到: 1
374
- 执行耗时: 45ms
375
- ```
376
-
377
- ## 高级功能
378
-
379
- ### 忽略规则
380
-
381
- URPF CLI 支持 `.gitignore` 风格的忽略规则,可以自动检测并应用以下文件:
382
- - `.gitignore`
383
- - `.iflowignore`
384
- - `.npmignore`
385
-
386
- 也可以通过 `-i` 选项指定自定义的忽略规则文件。
387
-
388
- **忽略规则示例**:
389
- ```gitignore
390
- # 忽略 node_modules 目录
391
- node_modules/
392
-
393
- # 忽略所有 .log 文件
394
- *.log
395
-
396
- # 忽略 build 目录
397
- build/
398
-
399
- # 忽略 .env 文件
400
- .env
401
- ```
402
-
403
- ### 递归控制
404
-
405
- 默认情况下,`pack` 命令会递归扫描所有子目录。使用 `--no-recurse` 选项可以只打包当前目录的文件:
406
-
407
- ```bash
408
- # 递归打包(默认)
409
- urpf-cli pack ./src
410
-
411
- # 只打包顶层文件
412
- urpf-cli pack ./src --no-recurse
413
- ```
414
-
415
- ### 输出文件控制
416
-
417
- 使用 `-o` 或 `--output` 选项指定输出文件路径:
418
-
419
- ```bash
420
- # 相对路径
421
- urpf-cli pack ./src -o ./output/src.urpf
422
-
423
- # 绝对路径
424
- urpf-cli pack ./src -o /tmp/src.urpf
425
-
426
- # 自定义文件名
427
- urpf-cli pack ./src -o my-package.urpf
428
- ```
429
-
430
- ### 覆盖已存在的文件
431
-
432
- 如果输出文件已存在,`pack` 命令会报错并提示用户。使用 `--force` 选项可以强制覆盖:
433
-
434
- ```bash
435
- # 第一次打包
436
- urpf-cli pack ./my-project -o my-project.urpf
437
-
438
- # 第二次打包(不使用 --force 会失败)
439
- urpf-cli pack ./my-project -o my-project.urpf
440
- # 错误: 输出文件已存在: my-project.urpf。请使用 --force 选项强制覆盖,或指定不同的输出路径。
441
-
442
- # 使用 --force 强制覆盖
443
- urpf-cli pack ./my-project -o my-project.urpf --force
444
- ```
445
-
446
- ## 变量替换
447
-
448
- `pack-remove` 命令支持变量替换功能,可以从 URPF 文件的属性部分读取变量定义,并在移除文件时应用这些变量。
449
-
450
- ### 变量定义
451
-
452
- 在 URPF 文件的属性部分定义变量:
453
-
454
- ```
455
- --URPF-BOUNDARY-a1b2c3d4--
456
-
457
- $root=subdir
458
- $version=1.0.0
459
-
460
- --URPF-BOUNDARY-a1b2c3d4--
461
-
462
- @file://${root}/config.json utf-8 644 lf
463
- {"name": "my-app", "version": "${version}"}
464
-
465
- --URPF-BOUNDARY-a1b2c3d4--
466
- ```
467
-
468
- ### 使用变量
469
-
470
- 在 `pack-remove` 命令中使用变量:
471
-
472
- ```bash
473
- # 移除 ${root}/config.json(实际移除 subdir/config.json)
474
- urpf-cli pack-remove package.urpf "${root}/config.json"
475
-
476
- # 移除 ${version}.txt(实际移除 1.0.0.txt)
477
- urpf-cli pack-remove package.urpf "${version}.txt"
478
- ```
479
-
480
- ## URPF 文件格式
481
-
482
- URPF 是一种用于打包、分发和精确描述多个关联资源的通用文本格式。它通过边界分隔符组织多个独立部分,每个部分可包含属性定义或资源内容。
483
-
484
- ### 格式示例
485
-
486
- ```
487
- --URPF-BOUNDARY-a1b2c3d4--
488
-
489
- $project=/home/user/project
490
- $version=1.0.0
491
-
492
- --URPF-BOUNDARY-a1b2c3d4--
493
-
494
- @file://${project}/config.json utf-8 644 lf
495
- {
496
- "name": "my-project",
497
- "version": "1.0.0"
498
- }
499
-
500
- --URPF-BOUNDARY-a1b2c3d4--
501
-
502
- @file://${project}/src/index.js utf-8 644 lf
503
- console.log("Hello, World!");
504
-
505
- --URPF-BOUNDARY-a1b2c3d4--
506
- ```
507
-
508
- ### 规范说明
509
-
510
- - **边界令牌**:8位十六进制数字,用于分隔不同的部分
511
- - **属性部分**:以 `$` 开头的变量定义
512
- - **资源部分**:以 `@` 开头的资源引用,包含 UDRS 引用、编码、权限和换行符类型
513
- - **资源引用**:遵循 UDRS v1.1 规范,支持文件协议和非文件协议
514
-
515
- 详细规范请参考 [URPF v1.0 规范文档](./goal.md)。
516
-
517
- ## 忽略规则
518
-
519
- 工具支持 `.gitignore` 风格的忽略规则,可以自动检测以下文件:
520
- - `.gitignore`
521
- - `.iflowignore`
522
- - `.npmignore`
523
-
524
- ### 忽略规则示例
525
-
526
- ```
527
- # 忽略 node_modules 目录
528
- node_modules/
529
-
530
- # 忽略所有日志文件
531
- *.log
532
-
533
- # 忽略临时文件
534
- *.tmp
535
- temp/
536
-
537
- # 忽略特定目录
538
- dist/
539
- build/
540
-
541
- # 但不忽略 dist/config.json
542
- !dist/config.json
543
- ```
544
-
545
- ## 开发
546
-
547
- ### 构建
548
-
549
- ```bash
550
- npm run build
551
- ```
552
-
553
- ### 测试
554
-
555
- ```bash
556
- # 运行所有测试
557
- npm test
558
-
559
- # 运行测试并显示覆盖率
560
- npm run test:coverage
561
- ```
562
-
563
- ### 代码检查
564
-
565
- ```bash
566
- # ESLint 检查
567
- npm run lint
568
-
569
- # 代码格式化
570
- npm run format
571
- ```
572
-
573
- ## 项目结构
574
-
575
- ```
576
- urpfcli/
577
- ├── src/
578
- │ ├── commands/ # 命令实现
579
- │ │ ├── pack.ts
580
- │ │ ├── unpack.ts
581
- │ │ └── types.ts
582
- │ ├── core/
583
- │ │ ├── parser/ # URPF 解析器
584
- │ │ ├── scanner/ # 文件扫描器
585
- │ │ ├── generator/ # URPF 生成器
586
- │ │ └── engine/ # UDRS 集成层
587
- │ ├── utils/ # 工具函数
588
- │ └── index.ts # CLI 入口
589
- ├── tests/ # 测试文件
590
- │ ├── integration/ # 集成测试
591
- │ └── fixtures/ # 测试数据
592
- ├── dist/ # 编译输出
593
- └── package.json
594
- ```
595
-
596
- ## 技术栈
597
-
598
- - **语言**: TypeScript
599
- - **模块系统**: ESM (ECMAScript Modules)
600
- - **运行时**: Node.js
601
- - **核心依赖**:
602
- - `@tq1086/urpf-sdk`: URPF 规范解析 SDK
603
- - `commander`: 命令行参数解析
604
- - **开发工具**:
605
- - `tsup`: 构建工具
606
- - `vitest`: 测试框架
607
- - `eslint`: 代码检查
608
- - `prettier`: 代码格式化
609
-
610
- ## 已知限制
611
-
612
- 1. **大文件处理**:当前版本将整个文件内容加载到内存,对于超大文件可能会有性能问题
613
- 2. **编码检测**:编码检测功能基于简单的启发式算法,可能不够准确
614
- 3. **符号链接**:默认不跟随符号链接,需要使用 `-f` 选项启用
615
-
616
- ## 未来计划
617
-
618
- - [x] 实现 `unpack` 子命令
619
- - [x] 支持 `pack-add` 和 `pack-remove` 子命令
620
- - [ ] 添加 `validate` 子命令(验证 URPF 文件格式)
621
- - [ ] 添加 `list` 子命令(列出 URPF 文件内容)
622
- - [ ] 支持流式处理大文件
623
- - [ ] 添加压缩支持
624
-
625
- ## 许可证
626
-
627
- ISC
628
-
629
- ## 贡献
630
-
631
- 欢迎提交 Issue 和 Pull Request!
1
+ # URPF CLI 工具
2
+
3
+ 基于 URPF (Universal Resource Package Format) v1.0 规范的命令行打包工具。
4
+
5
+ ## 项目链接
6
+
7
+ - **首页**: https://gitcode.com/tq1086/urpf-cli
8
+ - **仓库**: git@gitcode.com:tq1086/urpf-cli.git
9
+ - **问题反馈**: https://gitcode.com/tq1086/urpf-cli/issues
10
+
11
+ ## 功能特性
12
+
13
+ - ✅ 将文件或目录打包成 URPF 格式
14
+ - ✅ URPF 文件中解包资源到文件系统
15
+ - ✅ 向已有 URPF 包添加文件或目录
16
+ - ✅ URPF 包中移除文件(支持变量替换和通配符)
17
+ - ✅ 支持 `.gitignore` 风格的忽略规则
18
+ - ✅ 自动检测文件编码和换行符类型
19
+ - ✅ 保留文件权限和元数据
20
+ - ✅ 跨平台支持(Windows、Linux、macOS)
21
+ - ✅ 按字节偏移量切片文件(从0开始)
22
+ - ✅ 按行号切片文件(从1开始)
23
+ - ✅ 输出 URPF 内容到屏幕
24
+ - ✅ 复制 URPF 内容到剪贴板
25
+ - 打包环境变量到 URPF 属性
26
+ - ✅ 变量管理和环境变量管理
27
+
28
+ ## 安装
29
+
30
+ ```bash
31
+ # 全局安装
32
+ npm install -g @tq1086/urpf-cli
33
+
34
+ # 本地安装
35
+ npm install @tq1086/urpf-cli
36
+ ```
37
+
38
+ ## 使用方法
39
+
40
+ ### 基本用法
41
+
42
+ #### 打包命令 (pack)
43
+
44
+ URPF CLI 提供了子命令结构,支持灵活的包管理操作。
45
+
46
+ **创建新的 URPF 包**:
47
+
48
+ ```bash
49
+ # 创建新的 URPF 包
50
+ urpf-cli pack create package.json
51
+
52
+ # 打包目录
53
+ urpf-cli pack create src/
54
+
55
+ # 指定输出路径
56
+ urpf-cli pack create src/ -o output.urpf.txt
57
+
58
+ # 显示详细日志
59
+ urpf-cli pack create src/ -v
60
+
61
+ # 按字节偏移量切片(从0开始)
62
+ urpf-cli pack create file.txt --byte 100:200
63
+
64
+ # 按行号切片(从1开始)
65
+ urpf-cli pack create file.txt --line 10:20
66
+
67
+ # 输出到屏幕
68
+ urpf-cli pack create file.txt --stdout
69
+
70
+ # 复制到剪贴板
71
+ urpf-cli pack create file.txt --clipboard
72
+
73
+ # 打包环境变量
74
+ urpf-cli pack create src/ --env API_KEY
75
+ urpf-cli pack create src/ --env "*"
76
+ ```
77
+
78
+ **向已有 URPF 包添加文件**:
79
+
80
+ ```bash
81
+ # 添加单个文件
82
+ urpf-cli pack add package.urpf.txt newfile.txt
83
+
84
+ # 添加多个文件
85
+ urpf-cli pack add package.urpf.txt file1.txt file2.txt
86
+
87
+ # 添加目录
88
+ urpf-cli pack add package.urpf.txt newdir/
89
+
90
+ # 混合添加文件和目录
91
+ urpf-cli pack add package.urpf.txt file1.txt dir1/ file2.txt
92
+ ```
93
+
94
+ **从 URPF 包移除文件**:
95
+
96
+ ```bash
97
+ # 移除单个文件
98
+ urpf-cli pack remove package.urpf.txt oldfile.txt
99
+
100
+ # 移除多个文件
101
+ urpf-cli pack remove package.urpf.txt file1.txt file2.txt
102
+
103
+ # 使用通配符
104
+ urpf-cli pack remove package.urpf.txt "*.log"
105
+
106
+ # 使用变量替换
107
+ urpf-cli pack remove package.urpf.txt "${root}/config.json"
108
+ ```
109
+
110
+ #### 解包命令 (unpack)
111
+
112
+ ```bash
113
+ # 解包到当前目录
114
+ urpf-cli unpack package.urpf.txt
115
+
116
+ # 解包到指定目录
117
+ urpf-cli unpack package.urpf.txt -o ./output
118
+
119
+ # 只解压指定的文件
120
+ urpf-cli unpack package.urpf.txt config.json
121
+
122
+ # 只解压目录
123
+ urpf-cli unpack package.urpf.txt src/
124
+
125
+ # 解压多个文件
126
+ urpf-cli unpack package.urpf.txt config.json src/index.js
127
+
128
+ # 使用通配符
129
+ urpf-cli unpack package.urpf.txt "*.js"
130
+
131
+ # 强制覆盖已存在的文件
132
+ urpf-cli unpack package.urpf.txt --force
133
+
134
+ # 仅当源文件更新时才覆盖
135
+ urpf-cli unpack package.urpf.txt --force-when-newer
136
+
137
+ # 自动确认环境变量设置(无需用户交互)
138
+ urpf-cli unpack package.urpf.txt --unpack-env
139
+
140
+ # 应用变量替换到文件内容
141
+ urpf-cli unpack package.urpf.txt --apply-variables
142
+ ```
143
+
144
+ #### 列出命令 (list)
145
+
146
+ ```bash
147
+ # 列出 URPF 包中的所有文件
148
+ urpf-cli list package.urpf.txt
149
+
150
+ # 按模式过滤文件
151
+ urpf-cli list package.urpf.txt --pattern "*.js"
152
+
153
+ # 以 JSON 格式输出
154
+ urpf-cli list package.urpf.txt --json
155
+
156
+ # 显示详细信息
157
+ urpf-cli list package.urpf.txt -v
158
+ ```
159
+
160
+ #### 信息命令 (info)
161
+
162
+ ```bash
163
+ # 显示 URPF 包的摘要信息
164
+ urpf-cli info package.urpf.txt
165
+
166
+ # JSON 格式输出
167
+ urpf-cli info package.urpf.txt --json
168
+
169
+ # 显示详细信息
170
+ urpf-cli info package.urpf.txt -v
171
+ ```
172
+
173
+ #### 验证命令 (verify)
174
+
175
+ ```bash
176
+ # 验证 URPF 包的文件完整性
177
+ urpf-cli verify package.urpf.txt
178
+
179
+ # 尝试修复常见问题
180
+ urpf-cli verify package.urpf.txt --fix
181
+
182
+ # 显示详细日志
183
+ urpf-cli verify package.urpf.txt -v
184
+ ```
185
+
186
+ #### 比较命令 (diff)
187
+
188
+ ```bash
189
+ # 比较两个 URPF 包
190
+ urpf-cli diff package-v1.urpf.txt package-v2.urpf.txt
191
+
192
+ # 以 JSON 格式输出
193
+ urpf-cli diff package-v1.urpf.txt package-v2.urpf.txt --json
194
+ ```
195
+
196
+ #### 合并命令 (merge)
197
+
198
+ ```bash
199
+ # 合并多个 URPF 包
200
+ urpf-cli merge merged.urpf.txt pkg1.urpf.txt pkg2.urpf.txt
201
+
202
+ # 使用覆盖策略
203
+ urpf-cli merge merged.urpf.txt pkg1.urpf.txt pkg2.urpf.txt --strategy overwrite
204
+
205
+ # 使用重命名策略
206
+ urpf-cli merge merged.urpf.txt pkg1.urpf.txt pkg2.urpf.txt --strategy rename
207
+ ```
208
+
209
+ #### 变量管理命令 (var)
210
+
211
+ ```bash
212
+ # 添加变量
213
+ urpf-cli var add package.urpf.txt VERSION "1.0.0"
214
+
215
+ # 列出所有变量
216
+ urpf-cli var list package.urpf.txt
217
+
218
+ # 删除变量
219
+ urpf-cli var remove package.urpf.txt VERSION
220
+
221
+ # 清除所有变量
222
+ urpf-cli var clear package.urpf.txt
223
+ ```
224
+
225
+ #### 环境变量管理命令 (env)
226
+
227
+ ```bash
228
+ # 添加环境变量(使用系统值)
229
+ urpf-cli env add package.urpf.txt API_KEY
230
+
231
+ # 添加环境变量(指定值)
232
+ urpf-cli env add package.urpf.txt API_KEY "my-secret-key"
233
+
234
+ # 列出所有环境变量
235
+ urpf-cli env list package.urpf.txt
236
+
237
+ # 删除环境变量
238
+ urpf-cli env remove package.urpf.txt API_KEY
239
+
240
+ # 清除所有环境变量
241
+ urpf-cli env clear package.urpf.txt
242
+ ```
243
+
244
+ ### 文件后缀
245
+
246
+ URPF 文件使用 `.urpf.txt` 后缀,这是一种文本格式的资源包文件。
247
+
248
+ ### 环境变量支持
249
+
250
+ **打包环境变量**:
251
+ - 使用 `--env <name>` 打包单个环境变量
252
+ - 使用 `--env "*"` 打包全部环境变量(排除含 "key" 的变量)
253
+ - 使用 `--env <name> <value>` 指定环境变量的值
254
+
255
+ **解包环境变量**:
256
+ - 如果 URPF 包包含环境变量,解包时会提示用户是否设置
257
+ - 使用 `--unpack-env` 选项可自动确认环境变量设置(无需用户交互)
258
+ - 使用 `--apply-variables` 选项可应用变量替换到文件内容
259
+
260
+ ### 变量替换
261
+
262
+ URPF 包支持变量替换功能,可以在打包和解包时使用变量。
263
+
264
+ **定义变量**:
265
+ ```bash
266
+ urpf-cli var add package.urpf.txt ROOT "/path/to/root"
267
+ urpf-cli var add package.urpf.txt VERSION "1.0.0"
268
+ ```
269
+
270
+ **使用变量**:
271
+ ```bash
272
+ # 在 pack remove 中使用变量
273
+ urpf-cli pack remove package.urpf.txt "${ROOT}/config.json"
274
+ urpf-cli pack remove package.urpf.txt "${VERSION}.txt"
275
+
276
+ # 在文件内容中使用变量(解包时)
277
+ urpf-cli unpack package.urpf.txt --apply-variables
278
+ ```
279
+
280
+ ### 忽略规则
281
+
282
+ URPF CLI 支持 `.gitignore` 风格的忽略规则。
283
+
284
+ **默认忽略规则文件**:
285
+ - `.gitignore`
286
+ - `.urpfignore`
287
+
288
+ **白名单和黑名单**:
289
+ - `.urpfallow` - 白名单文件(格式与 .gitignore 一致)
290
+ - `.urpfforbid` - 黑名单文件(格式与 .gitignore 一致)
291
+
292
+ **文件打包规则**:
293
+ - 不在黑名单内
294
+ - 不在 ignore
295
+ - 在白名单内(或无白名单)
296
+ - 不以点开头
297
+
298
+ **指定忽略规则文件**:
299
+ ```bash
300
+ urpf-cli pack create src/ -i .customignore
301
+ ```
302
+
303
+ ## 高级用法
304
+
305
+ ### 字节切片
306
+
307
+ 按字节偏移量切片文件,从 0 开始。
308
+
309
+ ```bash
310
+ # 切片从字节 100 到 200
311
+ urpf-cli pack create file.txt --byte 100:200
312
+
313
+ # 切片从字节 100 到文件末尾
314
+ urpf-cli pack create file.txt --byte 100
315
+
316
+ # 切片从文件开头到字节 200
317
+ urpf-cli pack create file.txt --byte :200
318
+ ```
319
+
320
+ ### 行切片
321
+
322
+ 按行号切片文件,从 1 开始。
323
+
324
+ ```bash
325
+ # 切片第 10 到 20 行
326
+ urpf-cli pack create file.txt --line 10:20
327
+
328
+ # 切片第 10 行到文件末尾
329
+ urpf-cli pack create file.txt --line 10
330
+
331
+ # 切片从文件开头到第 20 行
332
+ urpf-cli pack create file.txt --line :20
333
+ ```
334
+
335
+ ### 跨平台路径处理
336
+
337
+ URPF CLI 自动处理不同操作系统的路径分隔符。
338
+
339
+ ```bash
340
+ # Windows
341
+ urpf-cli pack create C:\project\src\
342
+
343
+ # Linux/macOS
344
+ urpf-cli pack create /home/user/project/src/
345
+
346
+ # 相对路径
347
+ urpf-cli pack create ./src/
348
+ ```
349
+
350
+ ## 项目结构
351
+
352
+ ```
353
+ urpf-cli/
354
+ ├── src/
355
+ │ ├── commands/ # 命令实现
356
+ │ │ ├── pack.ts
357
+ │ │ ├── unpack.ts
358
+ │ │ ├── pack-add.ts
359
+ │ │ ├── pack-remove.ts
360
+ │ │ ├── list.ts
361
+ │ │ ├── info.ts
362
+ │ │ ├── verify.ts
363
+ │ │ ├── diff.ts
364
+ │ │ ├── merge.ts
365
+ │ │ ├── var.ts
366
+ │ │ ├── env.ts
367
+ │ │ └── types.ts
368
+ │ ├── core/
369
+ │ │ ├── parser/ # URPF 解析器
370
+ │ │ ├── scanner/ # 文件扫描器
371
+ │ │ ├── generator/ # URPF 生成器
372
+ │ │ └── engine/ # UDRS 集成层
373
+ │ ├── utils/ # 工具函数
374
+ │ └── index.ts # CLI 入口
375
+ ├── tests/ # 测试文件
376
+ ├── examples/ # 示例文件
377
+ ├── package.json
378
+ ├── tsconfig.json
379
+ └── readme.md
380
+ ```
381
+
382
+ ## 开发
383
+
384
+ ### 安装依赖
385
+
386
+ ```bash
387
+ npm install
388
+ ```
389
+
390
+ ### 构建项目
391
+
392
+ ```bash
393
+ npm run build
394
+ ```
395
+
396
+ ### 运行测试
397
+
398
+ ```bash
399
+ npm test
400
+ ```
401
+
402
+ ### 代码检查
403
+
404
+ ```bash
405
+ npm run lint
406
+ ```
407
+
408
+ ### 代码格式化
409
+
410
+ ```bash
411
+ npm run format
412
+ ```
413
+
414
+ ## 许可证
415
+
416
+ MIT License
417
+
418
+ ## 贡献
419
+
420
+ 欢迎提交 Issue 和 Pull Request!
421
+
422
+ ## 更新日志
423
+
424
+ 查看 [CHANGELOG.md](CHANGELOG.md) 了解版本更新历史。