@kkkwww/deploy 1.0.18 → 1.0.20
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/lib/index.d.ts +1 -1
- package/lib/index.js +122 -156
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
package/lib/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
1
|
+
#!/usr/bin/env node
|
|
2
2
|
export {};
|
package/lib/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
1
|
+
#!/usr/bin/env node
|
|
2
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -11,36 +11,27 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
import fs from 'fs';
|
|
12
12
|
import path from 'path';
|
|
13
13
|
import os from 'os';
|
|
14
|
+
import process from 'process';
|
|
14
15
|
import SftpClient from 'ssh2-sftp-client';
|
|
15
16
|
import { fileURLToPath } from 'url';
|
|
16
17
|
// ==========================
|
|
17
|
-
// ESM 兼容 __dirname
|
|
18
|
-
// ==========================
|
|
19
18
|
const __filename = fileURLToPath(import.meta.url);
|
|
20
19
|
const __dirname = path.dirname(__filename);
|
|
21
|
-
// ==========================
|
|
22
|
-
// 版本号
|
|
23
|
-
// ==========================
|
|
24
|
-
let VERSION = '0.0.0';
|
|
25
|
-
try {
|
|
26
|
-
const pkgPath = path.resolve(__dirname, '../package.json');
|
|
27
|
-
if (fs.existsSync(pkgPath)) {
|
|
28
|
-
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
29
|
-
VERSION = pkg.version || '0.0.0';
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
catch (_a) { }
|
|
33
|
-
// ==========================
|
|
34
|
-
// 并发线程
|
|
35
|
-
// ==========================
|
|
36
20
|
const CONCURRENCY = 5;
|
|
37
|
-
// ==========================
|
|
38
|
-
// 文件路径
|
|
39
|
-
// ==========================
|
|
40
21
|
const CACHE_FILE = path.join(os.homedir(), '.deploy-cache.json');
|
|
41
22
|
const SKIP_LOG_FILE = path.join(os.homedir(), '.deploy-skip.log');
|
|
42
23
|
// ==========================
|
|
43
|
-
//
|
|
24
|
+
// 读取 package.json version
|
|
25
|
+
function getVersion() {
|
|
26
|
+
try {
|
|
27
|
+
const pkgPath = path.resolve(process.cwd(), 'package.json');
|
|
28
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
29
|
+
return pkg.version || 'unknown';
|
|
30
|
+
}
|
|
31
|
+
catch (_a) {
|
|
32
|
+
return 'unknown';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
44
35
|
// ==========================
|
|
45
36
|
function getArgs() {
|
|
46
37
|
const args = {};
|
|
@@ -49,12 +40,13 @@ function getArgs() {
|
|
|
49
40
|
const [key, ...valArr] = arg.slice(2).split('=');
|
|
50
41
|
args[key] = valArr.join('=') || 'true';
|
|
51
42
|
}
|
|
43
|
+
else if (arg === '-v') {
|
|
44
|
+
args.version = 'true';
|
|
45
|
+
}
|
|
52
46
|
});
|
|
53
47
|
return args;
|
|
54
48
|
}
|
|
55
49
|
// ==========================
|
|
56
|
-
// 缓存读取和保存(数组形式,按 host)
|
|
57
|
-
// ==========================
|
|
58
50
|
function loadCache() {
|
|
59
51
|
try {
|
|
60
52
|
if (fs.existsSync(CACHE_FILE)) {
|
|
@@ -62,110 +54,75 @@ function loadCache() {
|
|
|
62
54
|
}
|
|
63
55
|
}
|
|
64
56
|
catch (_a) { }
|
|
65
|
-
return
|
|
66
|
-
}
|
|
67
|
-
function getCacheByHost(host) {
|
|
68
|
-
const list = loadCache();
|
|
69
|
-
return list.find(item => item.host === host) || {};
|
|
70
|
-
}
|
|
71
|
-
function saveCache(config) {
|
|
72
|
-
try {
|
|
73
|
-
const list = loadCache().filter(item => item.host !== config.host);
|
|
74
|
-
list.push({
|
|
75
|
-
host: config.host,
|
|
76
|
-
port: config.port,
|
|
77
|
-
user: config.user,
|
|
78
|
-
password: config.password,
|
|
79
|
-
remotePath: config.remotePath,
|
|
80
|
-
backup: config.backup
|
|
81
|
-
});
|
|
82
|
-
fs.writeFileSync(CACHE_FILE, JSON.stringify(list, null, 2));
|
|
83
|
-
console.log(`✅ 缓存已保存:${CACHE_FILE}`);
|
|
84
|
-
}
|
|
85
|
-
catch (e) {
|
|
86
|
-
console.error('❌ 保存缓存失败', e);
|
|
87
|
-
}
|
|
57
|
+
return {};
|
|
88
58
|
}
|
|
89
59
|
// ==========================
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
60
|
+
function saveCache(host, config) {
|
|
61
|
+
const all = loadCache();
|
|
62
|
+
if (!all[host])
|
|
63
|
+
all[host] = [];
|
|
64
|
+
const exist = all[host].some((c) => c.localPath === config.localPath && c.remotePath === config.remotePath);
|
|
65
|
+
if (!exist)
|
|
66
|
+
all[host].push(config);
|
|
67
|
+
fs.writeFileSync(CACHE_FILE, JSON.stringify(all, null, 2));
|
|
94
68
|
}
|
|
95
69
|
// ==========================
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
fs.appendFileSync(SKIP_LOG_FILE, logLine);
|
|
101
|
-
console.log(logLine.trim());
|
|
70
|
+
function logSkip(local, remote) {
|
|
71
|
+
const line = `${new Date().toISOString()} ⚡ 跳过 本地: ${local} → 远程: ${remote}\n`;
|
|
72
|
+
fs.appendFileSync(SKIP_LOG_FILE, line);
|
|
73
|
+
console.log(line.trim());
|
|
102
74
|
}
|
|
103
75
|
// ==========================
|
|
104
|
-
|
|
105
|
-
// ==========================
|
|
106
|
-
function isSameFile(sftp, localFile, remoteFile) {
|
|
76
|
+
function isSameFile(sftp, local, remote) {
|
|
107
77
|
return __awaiter(this, void 0, void 0, function* () {
|
|
108
78
|
try {
|
|
109
|
-
const
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
Math.floor(
|
|
113
|
-
|
|
79
|
+
const l = fs.statSync(local);
|
|
80
|
+
const r = yield sftp.stat(remote);
|
|
81
|
+
return (l.size === r.size &&
|
|
82
|
+
Math.floor(l.mtimeMs / 1000) === Math.floor(r.modifyTime / 1000));
|
|
83
|
+
}
|
|
84
|
+
catch (_a) {
|
|
85
|
+
return false;
|
|
114
86
|
}
|
|
115
|
-
catch (_a) { }
|
|
116
|
-
return false;
|
|
117
87
|
});
|
|
118
88
|
}
|
|
119
89
|
// ==========================
|
|
120
|
-
// 确保远程目录存在(逐级创建)
|
|
121
|
-
// ==========================
|
|
122
90
|
function ensureRemoteDir(sftp, remoteDir) {
|
|
123
91
|
return __awaiter(this, void 0, void 0, function* () {
|
|
124
|
-
const
|
|
125
|
-
let
|
|
126
|
-
for (const
|
|
127
|
-
|
|
92
|
+
const parts = remoteDir.split('/').filter(Boolean);
|
|
93
|
+
let cur = '';
|
|
94
|
+
for (const p of parts) {
|
|
95
|
+
cur += '/' + p;
|
|
128
96
|
try {
|
|
129
|
-
yield sftp.stat(
|
|
97
|
+
yield sftp.stat(cur);
|
|
130
98
|
}
|
|
131
99
|
catch (_a) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
console.log(`📁 创建远程目录:${current}`);
|
|
135
|
-
}
|
|
136
|
-
catch (err) {
|
|
137
|
-
console.error(`❌ 创建目录失败:${current}`, err);
|
|
138
|
-
}
|
|
100
|
+
yield sftp.mkdir(cur);
|
|
101
|
+
console.log(`📁 创建目录:${cur}`);
|
|
139
102
|
}
|
|
140
103
|
}
|
|
141
104
|
});
|
|
142
105
|
}
|
|
143
106
|
// ==========================
|
|
144
|
-
|
|
145
|
-
// ==========================
|
|
146
|
-
function uploadFile(sftp, localFile, remoteFile) {
|
|
107
|
+
function uploadFile(sftp, local, remote) {
|
|
147
108
|
return __awaiter(this, void 0, void 0, function* () {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
logSkip(fileName);
|
|
109
|
+
if (yield isSameFile(sftp, local, remote)) {
|
|
110
|
+
logSkip(local, remote);
|
|
151
111
|
return;
|
|
152
112
|
}
|
|
153
|
-
const
|
|
113
|
+
const size = fs.statSync(local).size;
|
|
154
114
|
let uploaded = 0;
|
|
155
|
-
|
|
156
|
-
console.log(`\n📤 上传文件`);
|
|
157
|
-
console.log(` 本地路径: ${localFile}`);
|
|
158
|
-
console.log(` 远程路径: ${remoteFile}`);
|
|
115
|
+
console.log(`\n📤 ${local} → ${remote}`);
|
|
159
116
|
return new Promise((resolve, reject) => {
|
|
160
|
-
const
|
|
161
|
-
|
|
162
|
-
uploaded +=
|
|
163
|
-
const pct = ((uploaded /
|
|
164
|
-
process.stdout.write(`
|
|
117
|
+
const rs = fs.createReadStream(local);
|
|
118
|
+
rs.on('data', (c) => {
|
|
119
|
+
uploaded += c.length;
|
|
120
|
+
const pct = ((uploaded / size) * 100).toFixed(1);
|
|
121
|
+
process.stdout.write(` ${pct}% (${uploaded}/${size})\r`);
|
|
165
122
|
});
|
|
166
|
-
sftp.put(
|
|
123
|
+
sftp.put(rs, remote)
|
|
167
124
|
.then(() => {
|
|
168
|
-
console.log(` ✅
|
|
125
|
+
console.log(` ✅ 完成`);
|
|
169
126
|
resolve();
|
|
170
127
|
})
|
|
171
128
|
.catch(reject);
|
|
@@ -173,102 +130,111 @@ function uploadFile(sftp, localFile, remoteFile) {
|
|
|
173
130
|
});
|
|
174
131
|
}
|
|
175
132
|
// ==========================
|
|
176
|
-
|
|
177
|
-
// ==========================
|
|
178
|
-
function uploadWithConcurrency(tasks, concurrency) {
|
|
133
|
+
function uploadWithConcurrency(tasks) {
|
|
179
134
|
return __awaiter(this, void 0, void 0, function* () {
|
|
180
|
-
const
|
|
181
|
-
for (const
|
|
182
|
-
const p =
|
|
183
|
-
|
|
184
|
-
if (
|
|
185
|
-
yield Promise.race(
|
|
135
|
+
const pool = new Set();
|
|
136
|
+
for (const t of tasks) {
|
|
137
|
+
const p = t().finally(() => pool.delete(p));
|
|
138
|
+
pool.add(p);
|
|
139
|
+
if (pool.size >= CONCURRENCY) {
|
|
140
|
+
yield Promise.race(pool);
|
|
186
141
|
}
|
|
187
142
|
}
|
|
188
|
-
yield Promise.all(
|
|
143
|
+
yield Promise.all(pool);
|
|
189
144
|
});
|
|
190
145
|
}
|
|
191
146
|
// ==========================
|
|
192
|
-
|
|
193
|
-
// ==========================
|
|
194
|
-
function uploadDirConcurrent(sftp, localDir, remoteDir) {
|
|
147
|
+
function uploadDir(sftp, localDir, remoteDir) {
|
|
195
148
|
return __awaiter(this, void 0, void 0, function* () {
|
|
196
149
|
yield ensureRemoteDir(sftp, remoteDir);
|
|
197
|
-
const
|
|
150
|
+
const list = fs.readdirSync(localDir);
|
|
198
151
|
const tasks = [];
|
|
199
|
-
for (const
|
|
200
|
-
const local = path.join(localDir,
|
|
201
|
-
const remote = path.posix.join(remoteDir,
|
|
152
|
+
for (const f of list) {
|
|
153
|
+
const local = path.join(localDir, f);
|
|
154
|
+
const remote = path.posix.join(remoteDir, f);
|
|
202
155
|
const stat = fs.statSync(local);
|
|
203
156
|
if (stat.isDirectory()) {
|
|
204
|
-
yield
|
|
157
|
+
yield uploadDir(sftp, local, remote);
|
|
205
158
|
}
|
|
206
159
|
else {
|
|
207
160
|
tasks.push(() => uploadFile(sftp, local, remote));
|
|
208
161
|
}
|
|
209
162
|
}
|
|
210
|
-
yield uploadWithConcurrency(tasks
|
|
163
|
+
yield uploadWithConcurrency(tasks);
|
|
211
164
|
});
|
|
212
165
|
}
|
|
213
166
|
// ==========================
|
|
214
|
-
// 主逻辑
|
|
215
|
-
// ==========================
|
|
216
167
|
function run() {
|
|
217
168
|
return __awaiter(this, void 0, void 0, function* () {
|
|
218
|
-
var _a;
|
|
219
169
|
const args = getArgs();
|
|
220
|
-
|
|
221
|
-
|
|
170
|
+
// ==== 版本打印 ====
|
|
171
|
+
if (args.version) {
|
|
172
|
+
console.log(`Deploy Script Version: ${getVersion()}`);
|
|
222
173
|
return;
|
|
223
174
|
}
|
|
224
175
|
const host = args.host;
|
|
225
|
-
const
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
remotePath: args.remote || args.serverDir || cache.remotePath,
|
|
233
|
-
backup: args.backup === 'false' ? false : ((_a = cache.backup) !== null && _a !== void 0 ? _a : true),
|
|
234
|
-
};
|
|
235
|
-
if (!config.host || !config.user || !config.localPath || !config.remotePath) {
|
|
176
|
+
const port = Number(args.port || 22);
|
|
177
|
+
const user = args.user || args.username;
|
|
178
|
+
const password = args.password;
|
|
179
|
+
const localPath = args.local || args.dir;
|
|
180
|
+
const remotePath = args.remote || args.serverDir;
|
|
181
|
+
const backup = args.backup !== 'false';
|
|
182
|
+
if (!host || !user || !password || !localPath || !remotePath) {
|
|
236
183
|
console.log(`
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
184
|
+
用法:
|
|
185
|
+
--host=IP --user=root --password=xxx
|
|
186
|
+
--local=./dist 或 --dir=./dist
|
|
187
|
+
--remote=/www/app 或 --serverDir=/www/app
|
|
188
|
+
--backup=false 可关闭备份
|
|
189
|
+
--version 或 -v 查看版本
|
|
190
|
+
`);
|
|
243
191
|
return;
|
|
244
192
|
}
|
|
245
|
-
const
|
|
246
|
-
|
|
247
|
-
const createRoot = args.createRoot === 'true' || false;
|
|
248
|
-
const remoteDir = createRoot ? path.posix.join(config.remotePath, localName) : config.remotePath;
|
|
249
|
-
console.log(`本地目录: ${localAbs}`);
|
|
250
|
-
console.log(`远程目录: ${remoteDir}`);
|
|
193
|
+
const config = { host, port, user, password, localPath, remotePath, backup };
|
|
194
|
+
console.log('配置:\n', config);
|
|
251
195
|
const sftp = new SftpClient();
|
|
252
196
|
try {
|
|
253
|
-
console.log('🔗 连接服务器...');
|
|
254
197
|
yield sftp.connect(config);
|
|
255
|
-
console.log('✅
|
|
198
|
+
console.log('✅ 已连接\n');
|
|
199
|
+
// ======================
|
|
200
|
+
const localAbs = path.resolve(localPath);
|
|
201
|
+
const baseName = path.basename(localAbs);
|
|
202
|
+
const keepRoot = remotePath.endsWith('/');
|
|
203
|
+
const finalRemote = keepRoot
|
|
204
|
+
? path.posix.join(remotePath, baseName)
|
|
205
|
+
: remotePath;
|
|
206
|
+
console.log(keepRoot
|
|
207
|
+
? `📁 保留根目录:${baseName}`
|
|
208
|
+
: `📂 不保留根目录,仅上传内容`);
|
|
209
|
+
console.log(`🚀 ${localAbs} → ${finalRemote}`);
|
|
210
|
+
// ======================
|
|
211
|
+
if (backup) {
|
|
212
|
+
try {
|
|
213
|
+
yield sftp.stat(finalRemote);
|
|
214
|
+
const backupPath = finalRemote + '_bak_' + Date.now();
|
|
215
|
+
yield sftp.rename(finalRemote, backupPath);
|
|
216
|
+
console.log(`📦 已备份 → ${backupPath}`);
|
|
217
|
+
}
|
|
218
|
+
catch (_a) { }
|
|
219
|
+
}
|
|
220
|
+
// ======================
|
|
256
221
|
if (fs.statSync(localAbs).isDirectory()) {
|
|
257
|
-
|
|
258
|
-
yield uploadDirConcurrent(sftp, localAbs, remoteDir);
|
|
222
|
+
yield uploadDir(sftp, localAbs, finalRemote);
|
|
259
223
|
}
|
|
260
224
|
else {
|
|
261
|
-
yield uploadFile(sftp, localAbs,
|
|
225
|
+
yield uploadFile(sftp, localAbs, finalRemote);
|
|
262
226
|
}
|
|
263
|
-
console.log('\n🎉
|
|
264
|
-
|
|
227
|
+
console.log('\n🎉 完成');
|
|
228
|
+
// 保存缓存
|
|
229
|
+
saveCache(host, config);
|
|
230
|
+
console.log('✅ 已缓存');
|
|
265
231
|
}
|
|
266
|
-
catch (
|
|
267
|
-
console.error('❌
|
|
232
|
+
catch (e) {
|
|
233
|
+
console.error('❌ 错误', e.message);
|
|
268
234
|
}
|
|
269
235
|
finally {
|
|
270
236
|
yield sftp.end();
|
|
271
|
-
console.log('🔌
|
|
237
|
+
console.log('🔌 已断开');
|
|
272
238
|
}
|
|
273
239
|
});
|
|
274
240
|
}
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;AACA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,6BAA6B;AAC7B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|