yx-oss-cli 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/README.md +255 -0
- package/dist/api.d.ts +115 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +176 -0
- package/dist/api.js.map +1 -0
- package/dist/bin/oss-cli.d.ts +7 -0
- package/dist/bin/oss-cli.d.ts.map +1 -0
- package/dist/bin/oss-cli.js +178 -0
- package/dist/bin/oss-cli.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/services/config.service.d.ts +56 -0
- package/dist/services/config.service.d.ts.map +1 -0
- package/dist/services/config.service.js +115 -0
- package/dist/services/config.service.js.map +1 -0
- package/dist/services/file.service.d.ts +46 -0
- package/dist/services/file.service.d.ts.map +1 -0
- package/dist/services/file.service.js +94 -0
- package/dist/services/file.service.js.map +1 -0
- package/dist/services/oss.service.d.ts +53 -0
- package/dist/services/oss.service.d.ts.map +1 -0
- package/dist/services/oss.service.js +171 -0
- package/dist/services/oss.service.js.map +1 -0
- package/dist/utils/logger.d.ts +55 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +103 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OssService - 阿里云 OSS 操作服务
|
|
3
|
+
* 封装上传、删除、连接测试等操作
|
|
4
|
+
*/
|
|
5
|
+
import OSS from 'ali-oss';
|
|
6
|
+
import pLimit from 'p-limit';
|
|
7
|
+
import { FileService, HTML_CACHE_HEADERS } from './file.service.js';
|
|
8
|
+
import { Logger } from '../utils/logger.js';
|
|
9
|
+
export class OssService {
|
|
10
|
+
client;
|
|
11
|
+
config;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
this.client = new OSS({
|
|
15
|
+
region: config.region,
|
|
16
|
+
accessKeyId: config.accessKeyId,
|
|
17
|
+
accessKeySecret: config.accessKeySecret,
|
|
18
|
+
bucket: config.bucket,
|
|
19
|
+
timeout: config.timeout,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 测试 OSS 连接
|
|
24
|
+
*/
|
|
25
|
+
async testConnection() {
|
|
26
|
+
Logger.info('正在测试 OSS 连接...');
|
|
27
|
+
Logger.envCheck('系统时间', new Date().toISOString());
|
|
28
|
+
Logger.envCheck('Bucket', this.config.bucket);
|
|
29
|
+
Logger.envCheck('Region', this.config.region);
|
|
30
|
+
try {
|
|
31
|
+
const result = await this.client.getBucketInfo();
|
|
32
|
+
const bucketInfo = {
|
|
33
|
+
name: result.bucket.Name,
|
|
34
|
+
region: result.bucket.Location,
|
|
35
|
+
creationDate: result.bucket.CreationDate,
|
|
36
|
+
};
|
|
37
|
+
Logger.success('OSS 连接成功');
|
|
38
|
+
Logger.info(`Bucket 名称: ${bucketInfo.name}`);
|
|
39
|
+
Logger.info(`区域: ${bucketInfo.region}`);
|
|
40
|
+
Logger.info(`创建时间: ${bucketInfo.creationDate}`);
|
|
41
|
+
return bucketInfo;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
const err = error;
|
|
45
|
+
Logger.errorWithSuggestions(`OSS 连接失败: ${err.message}`, [
|
|
46
|
+
'AccessKey ID/Secret 配置错误',
|
|
47
|
+
`Bucket 区域配置错误 (当前: ${this.config.region})`,
|
|
48
|
+
'系统时间与网络时间不同步',
|
|
49
|
+
'网络连接问题',
|
|
50
|
+
], '请检查凭证配置和网络连接');
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 上传单个文件
|
|
56
|
+
*/
|
|
57
|
+
async uploadFile(localPath, ossPath, headers) {
|
|
58
|
+
const options = headers ? { headers } : undefined;
|
|
59
|
+
await this.client.put(ossPath, localPath, options);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 上传目录
|
|
63
|
+
*/
|
|
64
|
+
async uploadDirectory(localDir, ossDir, options) {
|
|
65
|
+
const files = await FileService.walkDirectory(localDir, options.ignorePatterns);
|
|
66
|
+
const limit = pLimit(options.concurrency);
|
|
67
|
+
let success = 0;
|
|
68
|
+
let failed = 0;
|
|
69
|
+
const uploadedFiles = [];
|
|
70
|
+
Logger.info(`找到 ${files.length} 个文件待上传`);
|
|
71
|
+
const tasks = files.map((file) => limit(async () => {
|
|
72
|
+
const ossPath = `${ossDir}/${file.relativePath}`;
|
|
73
|
+
try {
|
|
74
|
+
const headers = file.isHtml ? HTML_CACHE_HEADERS : undefined;
|
|
75
|
+
await this.uploadFile(file.path, ossPath, headers);
|
|
76
|
+
success++;
|
|
77
|
+
uploadedFiles.push(ossPath);
|
|
78
|
+
Logger.upload(`上传: ${ossPath}`);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
failed++;
|
|
82
|
+
const err = error;
|
|
83
|
+
Logger.error(`上传失败: ${ossPath} - ${err.message}`);
|
|
84
|
+
}
|
|
85
|
+
}));
|
|
86
|
+
await Promise.all(tasks);
|
|
87
|
+
return {
|
|
88
|
+
success,
|
|
89
|
+
failed,
|
|
90
|
+
files: uploadedFiles,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 列出指定前缀的所有文件
|
|
95
|
+
*/
|
|
96
|
+
async listFiles(prefix) {
|
|
97
|
+
const files = [];
|
|
98
|
+
let marker;
|
|
99
|
+
do {
|
|
100
|
+
const result = await this.client.list({
|
|
101
|
+
prefix: prefix + '/',
|
|
102
|
+
'max-keys': 1000,
|
|
103
|
+
marker,
|
|
104
|
+
}, {});
|
|
105
|
+
if (result.objects) {
|
|
106
|
+
files.push(...result.objects.map((obj) => obj.name));
|
|
107
|
+
}
|
|
108
|
+
marker = result.nextMarker;
|
|
109
|
+
} while (marker);
|
|
110
|
+
return files;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 删除目录下的所有文件
|
|
114
|
+
*/
|
|
115
|
+
async deleteDirectory(ossDir) {
|
|
116
|
+
Logger.delete(`开始删除 OSS 目录: ${ossDir}`);
|
|
117
|
+
try {
|
|
118
|
+
const files = await this.listFiles(ossDir);
|
|
119
|
+
Logger.info(`找到 ${files.length} 个文件`);
|
|
120
|
+
if (files.length === 0) {
|
|
121
|
+
Logger.info('目录为空,无需删除');
|
|
122
|
+
return { success: true, deletedCount: 0 };
|
|
123
|
+
}
|
|
124
|
+
let deletedCount = 0;
|
|
125
|
+
for (const file of files) {
|
|
126
|
+
try {
|
|
127
|
+
await this.client.delete(file);
|
|
128
|
+
deletedCount++;
|
|
129
|
+
Logger.delete(`删除: ${file}`);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
const err = error;
|
|
133
|
+
Logger.error(`删除失败: ${file} - ${err.message}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
Logger.success(`已删除 ${deletedCount} 个文件`);
|
|
137
|
+
return { success: true, deletedCount };
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
const err = error;
|
|
141
|
+
Logger.errorWithSuggestions(`删除操作失败: ${err.message}`, [
|
|
142
|
+
'AccessKey ID/Secret 配置错误',
|
|
143
|
+
'Bucket 区域配置错误',
|
|
144
|
+
'系统时间与网络时间不同步',
|
|
145
|
+
'网络连接问题',
|
|
146
|
+
]);
|
|
147
|
+
return { success: false, deletedCount: 0, error: err.message };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* 同步目录(先删除再上传)
|
|
152
|
+
*/
|
|
153
|
+
async syncDirectory(localDir, ossDir, options) {
|
|
154
|
+
Logger.title(`同步目录: ${localDir} -> ${ossDir}`);
|
|
155
|
+
// 先删除旧文件
|
|
156
|
+
Logger.info('步骤 1/2: 删除旧文件...');
|
|
157
|
+
const deleteResult = await this.deleteDirectory(ossDir);
|
|
158
|
+
if (!deleteResult.success) {
|
|
159
|
+
throw new Error(`删除操作失败: ${deleteResult.error}`);
|
|
160
|
+
}
|
|
161
|
+
// 再上传新文件
|
|
162
|
+
Logger.info('步骤 2/2: 上传新文件...');
|
|
163
|
+
const uploadResult = await this.uploadDirectory(localDir, ossDir, options);
|
|
164
|
+
Logger.separator();
|
|
165
|
+
Logger.success('同步完成!');
|
|
166
|
+
Logger.info(`删除: ${deleteResult.deletedCount} 个文件`);
|
|
167
|
+
Logger.info(`上传: ${uploadResult.success} 成功, ${uploadResult.failed} 失败`);
|
|
168
|
+
return { deleteResult, uploadResult };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=oss.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oss.service.js","sourceRoot":"","sources":["../../src/services/oss.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger - 统一的日志输出工具
|
|
3
|
+
* 使用 emoji 美化输出,支持进度显示
|
|
4
|
+
*/
|
|
5
|
+
export declare class Logger {
|
|
6
|
+
/**
|
|
7
|
+
* 普通信息
|
|
8
|
+
*/
|
|
9
|
+
static info(message: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* 成功信息
|
|
12
|
+
*/
|
|
13
|
+
static success(message: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* 错误信息
|
|
16
|
+
*/
|
|
17
|
+
static error(message: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* 警告信息
|
|
20
|
+
*/
|
|
21
|
+
static warn(message: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* 上传信息
|
|
24
|
+
*/
|
|
25
|
+
static upload(message: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* 删除信息
|
|
28
|
+
*/
|
|
29
|
+
static delete(message: string): void;
|
|
30
|
+
/**
|
|
31
|
+
* 进度显示
|
|
32
|
+
*/
|
|
33
|
+
static progress(current: number, total: number, message?: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* 显示详细错误信息和排查建议
|
|
36
|
+
*/
|
|
37
|
+
static errorWithSuggestions(message: string, reasons: string[], solution?: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* 显示环境检查信息
|
|
40
|
+
*/
|
|
41
|
+
static envCheck(label: string, value: string | undefined, masked?: boolean): void;
|
|
42
|
+
/**
|
|
43
|
+
* 显示分隔线
|
|
44
|
+
*/
|
|
45
|
+
static separator(): void;
|
|
46
|
+
/**
|
|
47
|
+
* 显示标题
|
|
48
|
+
*/
|
|
49
|
+
static title(message: string): void;
|
|
50
|
+
/**
|
|
51
|
+
* 显示完成信息
|
|
52
|
+
*/
|
|
53
|
+
static done(successCount: number, failCount: number): void;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,MAAM;IACf;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAInC;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IASvE;;OAEG;IACH,MAAM,CAAC,oBAAoB,CACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,CAAC,EAAE,MAAM,GAClB,IAAI;IAcP;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,UAAQ,GAAG,IAAI;IAW/E;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,IAAI;IAIxB;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKnC;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;CAG7D"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger - 统一的日志输出工具
|
|
3
|
+
* 使用 emoji 美化输出,支持进度显示
|
|
4
|
+
*/
|
|
5
|
+
export class Logger {
|
|
6
|
+
/**
|
|
7
|
+
* 普通信息
|
|
8
|
+
*/
|
|
9
|
+
static info(message) {
|
|
10
|
+
console.log(`🔍 ${message}`);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 成功信息
|
|
14
|
+
*/
|
|
15
|
+
static success(message) {
|
|
16
|
+
console.log(`✅ ${message}`);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 错误信息
|
|
20
|
+
*/
|
|
21
|
+
static error(message) {
|
|
22
|
+
console.error(`❌ ${message}`);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 警告信息
|
|
26
|
+
*/
|
|
27
|
+
static warn(message) {
|
|
28
|
+
console.warn(`⚠️ ${message}`);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 上传信息
|
|
32
|
+
*/
|
|
33
|
+
static upload(message) {
|
|
34
|
+
console.log(`📤 ${message}`);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 删除信息
|
|
38
|
+
*/
|
|
39
|
+
static delete(message) {
|
|
40
|
+
console.log(`🗑️ ${message}`);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 进度显示
|
|
44
|
+
*/
|
|
45
|
+
static progress(current, total, message) {
|
|
46
|
+
const percent = Math.round((current / total) * 100);
|
|
47
|
+
const msg = message ? ` - ${message}` : '';
|
|
48
|
+
process.stdout.write(`\r📊 进度: ${current}/${total} (${percent}%)${msg}`);
|
|
49
|
+
if (current === total) {
|
|
50
|
+
console.log(); // 换行
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 显示详细错误信息和排查建议
|
|
55
|
+
*/
|
|
56
|
+
static errorWithSuggestions(message, reasons, solution) {
|
|
57
|
+
console.error(`\n❌ 错误: ${message}`);
|
|
58
|
+
if (reasons.length > 0) {
|
|
59
|
+
console.error('🔧 可能的原因:');
|
|
60
|
+
reasons.forEach((reason, index) => {
|
|
61
|
+
console.error(` ${index + 1}. ${reason}`);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (solution) {
|
|
65
|
+
console.error(`📋 解决方案: ${solution}`);
|
|
66
|
+
}
|
|
67
|
+
console.error();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 显示环境检查信息
|
|
71
|
+
*/
|
|
72
|
+
static envCheck(label, value, masked = false) {
|
|
73
|
+
if (value) {
|
|
74
|
+
const displayValue = masked
|
|
75
|
+
? value.substring(0, 4) + '...' + value.substring(value.length - 4)
|
|
76
|
+
: value;
|
|
77
|
+
console.log(` ${label}: ${displayValue}`);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
console.log(` ${label}: 未设置`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 显示分隔线
|
|
85
|
+
*/
|
|
86
|
+
static separator() {
|
|
87
|
+
console.log('─'.repeat(50));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 显示标题
|
|
91
|
+
*/
|
|
92
|
+
static title(message) {
|
|
93
|
+
console.log(`\n🎯 ${message}`);
|
|
94
|
+
this.separator();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 显示完成信息
|
|
98
|
+
*/
|
|
99
|
+
static done(successCount, failCount) {
|
|
100
|
+
console.log(`\n🎉 完成!成功 ${successCount} 个,失败 ${failCount} 个`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "yx-oss-cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "阿里云 OSS 命令行工具,支持文件上传、删除、同步等操作",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"oss-cli": "./dist/bin/oss-cli.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"dev": "tsc --watch",
|
|
14
|
+
"test": "vitest run",
|
|
15
|
+
"test:watch": "vitest",
|
|
16
|
+
"lint": "tsc --noEmit"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"oss",
|
|
20
|
+
"aliyun",
|
|
21
|
+
"cli",
|
|
22
|
+
"upload",
|
|
23
|
+
"deploy"
|
|
24
|
+
],
|
|
25
|
+
"author": "",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"ali-oss": "^6.21.0",
|
|
29
|
+
"commander": "^12.1.0",
|
|
30
|
+
"p-limit": "^6.1.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/node": "^22.10.0",
|
|
34
|
+
"fast-check": "^3.23.0",
|
|
35
|
+
"typescript": "^5.7.0",
|
|
36
|
+
"vitest": "^2.1.0"
|
|
37
|
+
},
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=18.0.0"
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"dist"
|
|
43
|
+
]
|
|
44
|
+
}
|