@kkkwww/deploy 1.0.10

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 ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/lib/index.js ADDED
@@ -0,0 +1,233 @@
1
+ #!/usr/bin/env node
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ import fs from 'fs';
12
+ import path from 'path';
13
+ import os from 'os';
14
+ import SftpClient from 'ssh2-sftp-client';
15
+ import { fileURLToPath } from 'url';
16
+ // ==========================
17
+ // ESM 兼容 __dirname
18
+ // ==========================
19
+ const __filename = fileURLToPath(import.meta.url);
20
+ const __dirname = path.dirname(__filename);
21
+ // ==========================
22
+ // 读取 package.json 版本号
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 (e) { }
33
+ // ==========================
34
+ // 多线程配置
35
+ // ==========================
36
+ const CONCURRENCY = 5;
37
+ // ==========================
38
+ // 缓存文件
39
+ // ==========================
40
+ const CACHE_FILE = path.join(os.homedir(), '.deploy-cache.json');
41
+ // ==========================
42
+ // 解析命令行
43
+ // ==========================
44
+ function getArgs() {
45
+ const args = {};
46
+ process.argv.slice(2).forEach((arg) => {
47
+ if (arg.startsWith('--')) {
48
+ const [key, ...valArr] = arg.slice(2).split('=');
49
+ args[key] = valArr.join('=');
50
+ }
51
+ });
52
+ return args;
53
+ }
54
+ // ==========================
55
+ // 读取缓存
56
+ // ==========================
57
+ function loadCache() {
58
+ try {
59
+ if (fs.existsSync(CACHE_FILE)) {
60
+ const data = fs.readFileSync(CACHE_FILE, 'utf8');
61
+ return JSON.parse(data);
62
+ }
63
+ }
64
+ catch (e) { }
65
+ return {};
66
+ }
67
+ // ==========================
68
+ // 保存缓存
69
+ // ==========================
70
+ function saveCache(config) {
71
+ try {
72
+ const cache = {
73
+ host: config.host,
74
+ port: config.port,
75
+ user: config.user,
76
+ password: config.password,
77
+ remotePath: config.remotePath,
78
+ backup: config.backup,
79
+ };
80
+ fs.writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2));
81
+ }
82
+ catch (e) { }
83
+ }
84
+ // ==========================
85
+ // 时间戳
86
+ // ==========================
87
+ function getTimeStamp() {
88
+ return new Date().toISOString().replace(/[:.]/g, '-');
89
+ }
90
+ // ==========================
91
+ // 上传文件
92
+ // ==========================
93
+ function uploadFile(sftp, localFile, remoteFile) {
94
+ return __awaiter(this, void 0, void 0, function* () {
95
+ const fileSize = fs.statSync(localFile).size;
96
+ let uploaded = 0;
97
+ const fileName = path.basename(localFile);
98
+ console.log(`\n📤 上传:${fileName}`);
99
+ return new Promise((resolve, reject) => {
100
+ const readStream = fs.createReadStream(localFile);
101
+ readStream.on('data', (chunk) => {
102
+ uploaded += chunk.length;
103
+ const pct = ((uploaded / fileSize) * 100).toFixed(1);
104
+ process.stdout.write(` 进度:${pct}% (${uploaded}/${fileSize} B)\r`);
105
+ });
106
+ sftp.put(readStream, remoteFile)
107
+ .then(() => {
108
+ console.log(` ✅ 完成:${fileName}`);
109
+ resolve();
110
+ })
111
+ .catch(reject);
112
+ });
113
+ });
114
+ }
115
+ // ==========================
116
+ // 并发上传
117
+ // ==========================
118
+ function uploadWithConcurrency(tasks, concurrency) {
119
+ return __awaiter(this, void 0, void 0, function* () {
120
+ const executing = new Set();
121
+ for (const task of tasks) {
122
+ const p = task().finally(() => executing.delete(p));
123
+ executing.add(p);
124
+ if (executing.size >= concurrency) {
125
+ yield Promise.race(executing);
126
+ }
127
+ }
128
+ yield Promise.all(executing);
129
+ });
130
+ }
131
+ // ==========================
132
+ // 递归上传目录
133
+ // ==========================
134
+ function uploadDirConcurrent(sftp, localDir, remoteDir) {
135
+ return __awaiter(this, void 0, void 0, function* () {
136
+ yield sftp.mkdir(remoteDir, true);
137
+ const files = fs.readdirSync(localDir);
138
+ const tasks = [];
139
+ for (const file of files) {
140
+ const local = path.join(localDir, file);
141
+ const remote = path.posix.join(remoteDir, file);
142
+ const stat = fs.statSync(local);
143
+ if (stat.isDirectory()) {
144
+ yield uploadDirConcurrent(sftp, local, remote);
145
+ }
146
+ else {
147
+ tasks.push(() => uploadFile(sftp, local, remote));
148
+ }
149
+ }
150
+ yield uploadWithConcurrency(tasks, CONCURRENCY);
151
+ });
152
+ }
153
+ // ==========================
154
+ // 主逻辑
155
+ // ==========================
156
+ function run() {
157
+ return __awaiter(this, void 0, void 0, function* () {
158
+ var _a;
159
+ const args = process.argv.slice(2);
160
+ // 版本
161
+ if (args.includes('-v') || args.includes('-V') || args.includes('--version')) {
162
+ console.log('┌─────────────────────┐');
163
+ console.log('│ deploy 部署工具 │');
164
+ console.log(`│ v${VERSION} │`);
165
+ console.log(`│ 多线程并发:${CONCURRENCY} 个 │`);
166
+ console.log('└─────────────────────┘');
167
+ return;
168
+ }
169
+ const cache = loadCache();
170
+ const argParams = getArgs();
171
+ const config = {
172
+ host: argParams.host || cache.host,
173
+ port: Number(argParams.port || cache.port) || 22,
174
+ user: argParams.user || cache.user,
175
+ password: argParams.password || cache.password,
176
+ localPath: argParams.local,
177
+ remotePath: argParams.remote || cache.remotePath,
178
+ backup: argParams.backup === 'false' ? false : ((_a = cache.backup) !== null && _a !== void 0 ? _a : true),
179
+ };
180
+ if (!config.host || !config.user || !config.localPath || !config.remotePath) {
181
+ console.log(`
182
+ ┌───────────────────────────────────────────┐
183
+ │ deploy 一键部署工具 │
184
+ ├───────────────────────────────────────────┤
185
+ │ 命令:deploy --host=IP --port=22 --user=root --password=123 --local=./dist --remote=/www/project
186
+ │ 简化:deploy --local=./dist
187
+ │ 关闭备份:--backup=false
188
+ │ 版本查看:-v / --version
189
+ └───────────────────────────────────────────┘
190
+ `);
191
+ return;
192
+ }
193
+ saveCache(config);
194
+ console.log('✅ 配置已缓存');
195
+ const sftp = new SftpClient();
196
+ try {
197
+ console.log('🔗 连接服务器中...');
198
+ yield sftp.connect(config);
199
+ console.log('✅ 连接成功\n');
200
+ // 备份
201
+ if (config.backup) {
202
+ try {
203
+ yield sftp.stat(config.remotePath);
204
+ const backupPath = `${config.remotePath}_backup_${getTimeStamp()}`;
205
+ console.log(`📦 备份旧目录:${backupPath}`);
206
+ yield sftp.rename(config.remotePath, backupPath);
207
+ }
208
+ catch (e) {
209
+ console.log('ℹ 远程目录不存在,跳过备份');
210
+ }
211
+ }
212
+ // 上传
213
+ const localAbs = path.resolve(config.localPath);
214
+ if (fs.statSync(localAbs).isDirectory()) {
215
+ console.log(`🚀 开始上传(并发 ${CONCURRENCY} 线程)`);
216
+ yield uploadDirConcurrent(sftp, localAbs, config.remotePath);
217
+ }
218
+ else {
219
+ yield uploadFile(sftp, localAbs, config.remotePath);
220
+ }
221
+ console.log('\n🎉 部署完成!');
222
+ }
223
+ catch (err) {
224
+ console.error('\n❌ 错误:', err.message);
225
+ }
226
+ finally {
227
+ yield sftp.end();
228
+ console.log('🔌 连接已关闭');
229
+ }
230
+ });
231
+ }
232
+ run();
233
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@kkkwww/deploy",
3
+ "version": "1.0.10",
4
+ "description": "简易部署工具",
5
+ "type": "module",
6
+ "bin": {
7
+ "deploy": "./lib/index.js"
8
+ },
9
+ "files": [
10
+ "lib"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "pub": "npm publish --access=public --registry=https://registry.npmjs.org/"
15
+ },
16
+ "author": "kkw",
17
+ "dependencies": {
18
+ "ssh2-sftp-client": "^12.1.1"
19
+ },
20
+ "devDependencies": {
21
+ "@types/node": "^25.5.0",
22
+ "@types/ssh2-sftp-client": "^9.0.6",
23
+ "ts-node": "^10.9.2",
24
+ "typescript": "^5.9.3"
25
+ }
26
+ }
package/readme.md ADDED
@@ -0,0 +1,92 @@
1
+ # deploy
2
+ > 🔥 轻量、高效、多线程 SFTP 自动化部署工具
3
+ > 一行命令上传项目到服务器,支持配置缓存、自动备份、自定义端口
4
+
5
+ ## ✨ 特性
6
+ - 🚀 **多线程并发上传**,上传速度大幅提升
7
+ - 🔌 **支持自定义端口**(默认 22)
8
+ - 💾 **配置自动缓存**,一次配置,后续一键部署
9
+ - 📦 **上传前自动备份远程目录**,安全不丢失
10
+ - 📊 **实时上传进度显示**
11
+ - 🌍 **全平台支持**(Windows / macOS / Linux)
12
+ - 🛠️ **全局命令调用**,安装后直接使用 `deploy`
13
+ - 📦 **可直接发布到 npm**
14
+
15
+ ## 📦 安装
16
+ ```bash
17
+ # 全局安装(推荐)
18
+ npm install -g deploy
19
+ ```
20
+
21
+ ## 🚀 快速使用
22
+ ### 首次使用(完整参数)
23
+ ```bash
24
+ deploy --host=192.168.1.100 --port=22 --user=root --password=123456 --local=./dist --remote=/www/project
25
+ ```
26
+
27
+ ### 后续使用(配置已缓存)
28
+ ```bash
29
+ deploy --local=./dist
30
+ ```
31
+
32
+ ### 关闭自动备份
33
+ ```bash
34
+ deploy --local=./dist --backup=false
35
+ ```
36
+
37
+ ### 查看版本
38
+ ```bash
39
+ deploy -v
40
+ # 或
41
+ deploy --version
42
+ ```
43
+
44
+ ## 📖 命令参数
45
+ | 参数 | 说明 |
46
+ |------|------|
47
+ | `--host` | 服务器 IP / 域名 |
48
+ | `--port` | SFTP 端口(默认 22) |
49
+ | `--user` | 服务器登录用户名 |
50
+ | `--password` | 服务器登录密码 |
51
+ | `--local` | 本地需要上传的目录 / 文件(必填) |
52
+ | `--remote` | 服务器目标路径 |
53
+ | `--backup` | 是否自动备份远程目录(默认 true) |
54
+ | `-v, --version` | 查看版本号 |
55
+
56
+ ## 🏗 项目结构
57
+ ```
58
+ ├── src/ # TypeScript 源码
59
+ ├── lib/ # 编译输出目录
60
+ ├── package.json
61
+ ├── tsconfig.json
62
+ └── README.md
63
+ ```
64
+
65
+ ## 🔨 本地开发 & 编译
66
+ ```bash
67
+ # 安装依赖
68
+ npm install
69
+
70
+ # 编译 TypeScript
71
+ npm run build
72
+ ```
73
+
74
+ ## 📦 发布到 npm
75
+ ```bash
76
+ npm run build
77
+ npm login
78
+ npm publish
79
+ ```
80
+
81
+ ## 📌 重要说明
82
+ - 配置缓存文件保存在用户目录:`~/.deploy-cache.json`
83
+ - 默认并发上传数:**5**,可在源码中修改
84
+ - 支持目录递归上传
85
+ - 上传前自动备份,避免覆盖丢失
86
+
87
+ ## 📄 License
88
+ MIT
89
+
90
+ ## 👨‍💻 作者
91
+ **kkw**
92
+ 简易高效的项目自动化部署工具