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