@winner-fed/build-security
安全构建工具库 - 支持文件加密、加签和过滤功能
功能特性
- ✅ 文件加密:支持对指定类型的文件进行 AES-256-CBC 加密
- ✅ 文件加签:生成文件哈希清单并加密存储
- ✅ 文件过滤:支持通过文件名、glob 模式或正则表达式过滤文件
- ✅ ZIP 处理:支持直接处理 ZIP 压缩包
- ✅ 目录处理:支持处理整个目录结构
安装
npm install @winner-fed/build-security
基本使用
简单示例
import { SecurityBuilder } from '@winner-fed/build-security';
const builder = new SecurityBuilder({
encrypt: true,
sign: true
});
builder
.build('./dist', './output/dist_security.zip')
.then((outputPath) => {
console.log('构建完成:', outputPath);
})
.catch((err) => {
console.error('构建失败:', err);
});
使用 async/await
import { SecurityBuilder } from '@winner-fed/build-security';
async function buildSecurity() {
const builder = new SecurityBuilder({
encrypt: true,
sign: false
});
try {
const outputPath = await builder.build('./dist', './output/dist_encrypted.zip');
console.log('构建完成:', outputPath);
} catch (err) {
console.error('构建失败:', err);
}
}
buildSecurity();
配置选项
SecurityBuilder 构造函数选项
encrypt | boolean | false | 是否启用文件加密 |
sign | boolean | false | 是否启用文件加签 |
excludeFiles | string[] | [] | 需要过滤的文件列表(支持 glob 模式) |
excludePatterns | (string|RegExp)[] | [] | 需要过滤的文件模式(正则表达式) |
build 方法参数
builder.build(entry, outputName);
entry (string|string[]): 输入路径,可以是:
- 单个文件夹/ZIP 文件路径
- 路径数组(支持多个输入)
- Glob 模式(如
./dist/*.zip、./packages/**/dist)
- 混合使用(数组中可以包含普通路径和 glob 模式)
outputName (string): 输出 ZIP 文件名(可选,不指定则自动生成)
文件过滤功能
使用文件名过滤
const builder = new SecurityBuilder({
encrypt: true,
excludeFiles: ['config.json', 'README.md', 'package.json']
});
使用 Glob 模式过滤
const builder = new SecurityBuilder({
encrypt: true,
excludeFiles: [
'**/*.test.js',
'**/node_modules/**',
'**/*.map',
'dist/**/*.log'
]
});
使用正则表达式过滤
const builder = new SecurityBuilder({
encrypt: true,
excludePatterns: [
/\.test\.js$/,
/^config/,
/node_modules/,
/\.(map|log|md)$/i
]
});
组合使用多种过滤方式
const builder = new SecurityBuilder({
encrypt: true,
sign: true,
excludeFiles: ['**/*.test.js', '**/node_modules/**'],
excludePatterns: [/\.map$/, /^\./]
});
完整示例
示例 1:仅加密
import { SecurityBuilder } from '@winner-fed/build-security';
const builder = new SecurityBuilder({
encrypt: true,
excludeFiles: ['**/*.map', '**/*.log']
});
builder.build('./dist', './output/dist_encrypted.zip').then((path) => console.log('加密完成:', path));
示例 2:仅加签
import { SecurityBuilder } from '@winner-fed/build-security';
const builder = new SecurityBuilder({
sign: true
});
builder.build('./dist', './output/dist_signed.zip').then((path) => console.log('加签完成:', path));
示例 3:加密 + 加签
import { SecurityBuilder } from '@winner-fed/build-security';
const builder = new SecurityBuilder({
encrypt: true,
sign: true,
excludeFiles: ['**/*.map', '**/*.test.js', '**/node_modules/**']
});
builder.build('./dist', './output/dist_encrypted_signed.zip').then((path) => console.log('加密加签完成:', path));
示例 4:处理 ZIP 文件
import { SecurityBuilder } from '@winner-fed/build-security';
const builder = new SecurityBuilder({
encrypt: true,
sign: true
});
builder.build('./input.zip', './output/processed.zip').then((path) => console.log('处理完成:', path));
示例 5:处理多个输入
import { SecurityBuilder } from '@winner-fed/build-security';
const builder = new SecurityBuilder({
encrypt: true,
sign: true
});
builder
.build(['./dist/app1', './dist/app2', './dist/app3.zip'], './output/merged.zip')
.then((path) => console.log('合并处理完成:', path));
示例 6:使用 Glob 模式
import { SecurityBuilder } from '@winner-fed/build-security';
const builder = new SecurityBuilder({
encrypt: true,
sign: true
});
builder.build('./dist/*.zip', './output/all_zips.zip').then((path) => console.log('处理完成:', path));
builder.build('./packages/**/dist', './output/all_dists.zip').then((path) => console.log('处理完成:', path));
builder
.build(['./dist/app1', './dist/*.zip', './packages/**/build'], './output/merged.zip')
.then((path) => console.log('合并处理完成:', path));
加密文件类型
默认情况下,以下类型的文件会被加密:
.html
.js
.json
.css
.txt
以下文件不会被加密(即使匹配类型):
gmu-hash-manifest.json
gmu-hash-manifest-v2.json
输出文件命名规则
如果不指定输出文件名,系统会自动生成:
- 仅加密:
{原文件名}_yyyyMMdd_encrypted.zip
- 仅加签:
{原文件名}_yyyyMMdd_signed.zip
- 加密+加签:
{原文件名}_yyyyMMdd_encrypted_signed.zip
注意事项
-
二次加密限制:如果目录中已存在 gmu-config-manifest.json,则不能再次进行加密操作(除非同时进行加签)
-
文件过滤优先级:
- 如果文件匹配
excludeFiles 中的任何模式,将被过滤
- 如果文件匹配
excludePatterns 中的任何正则,将被过滤
- 过滤的文件不会参与加密和加签操作
-
临时文件:处理过程中会在系统临时目录创建临时文件,处理完成后会自动清理
-
路径格式:支持相对路径和绝对路径,路径中的反斜杠会自动转换为正斜杠
-
多输入处理方式:
- 单个输入:直接处理并打包成一个 ZIP 文件
- 多个输入:每个输入会单独进行加密加签并打包成独立的 ZIP 文件,然后这些独立的 ZIP 文件会被合并到一个最终的 ZIP 中
- 解压最终的 ZIP 后,会得到多个独立的已加密加签的 ZIP 文件,每个保持原始文件名
错误处理
import { SecurityBuilder } from '@winner-fed/build-security';
const builder = new SecurityBuilder({
encrypt: true
});
builder
.build('./dist', './output.zip')
.then((path) => {
console.log('成功:', path);
})
.catch((err) => {
if (err.message === '路径不存在!') {
console.error('指定的输入路径不存在');
} else if (err.message === '文件名冲突!') {
console.error('输出文件已存在,请更换文件名');
} else if (err.message === '不可以进行二次加密!') {
console.error('目录已加密,不能再次加密');
} else {
console.error('未知错误:', err);
}
});
API 参考
SecurityBuilder 类
导入
import { SecurityBuilder } from '@winner-fed/build-security';
构造函数
new SecurityBuilder(options);
方法
build(entry, outputName)
执行安全构建操作
- 参数:
entry (string|string[]): 输入路径,支持:
- 单个文件夹/ZIP 文件路径
- 路径数组(多个输入)
- Glob 模式(如
./dist/*.zip、./packages/**/dist)
- 混合使用(数组中可以包含普通路径和 glob 模式)
- 多个输入时会合并到一个 ZIP 文件
outputName (string, 可选): 输出 ZIP 文件名
- 返回:
Promise<string> - 返回生成的 ZIP 文件路径
- 抛出: 各种错误情况会抛出 Error
许可证
ISC