@vitarx/release-cli 1.0.3 → 1.0.5
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/dist/release.js +42 -12
- package/dist/utils.d.ts +2 -1
- package/dist/utils.js +3 -2
- package/package.json +1 -1
package/dist/release.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env ts-node
|
|
2
2
|
import chalk from 'chalk';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
4
|
+
import * as console from 'node:console';
|
|
3
5
|
import fs from 'node:fs';
|
|
4
6
|
import path from 'node:path';
|
|
5
7
|
import process from 'node:process';
|
|
@@ -98,8 +100,9 @@ function parseArgs() {
|
|
|
98
100
|
* @param packageManager - 检测到的包管理器类型
|
|
99
101
|
* @param isDryRun - 是否为试运行模式,默认为 false
|
|
100
102
|
* @param args - 命令行参数对象
|
|
103
|
+
* @param lastCommitHash - 最后一次提交哈希值
|
|
101
104
|
*/
|
|
102
|
-
async function publishPackage(pkgDir, packageManager, isDryRun = false, args) {
|
|
105
|
+
async function publishPackage(pkgDir, packageManager, isDryRun = false, args, lastCommitHash) {
|
|
103
106
|
// 获取 package.json 的完整路径
|
|
104
107
|
const pkgPath = path.join(pkgDir, 'package.json');
|
|
105
108
|
// 读取并解析 package.json 文件
|
|
@@ -198,16 +201,15 @@ async function publishPackage(pkgDir, packageManager, isDryRun = false, args) {
|
|
|
198
201
|
runCommand(`git push${tagName ? ' && git push --tags' : ''}`, isDryRun);
|
|
199
202
|
}
|
|
200
203
|
catch {
|
|
201
|
-
log.warn('包已发布到pnm,但推送代码和标签到远程仓库意外失败,请仔细核查npm
|
|
204
|
+
log.warn('包已发布到pnm,但推送代码和标签到远程仓库意外失败,请仔细核查npm仓库和Git远程仓库状态。');
|
|
202
205
|
}
|
|
203
206
|
// 打印发布成功信息
|
|
204
207
|
log.success(`发布完成 ${pkg.name}@${newVersion}` + (isDryRun ? ' (dry-run)' : ''));
|
|
205
208
|
}
|
|
206
209
|
catch (err) {
|
|
207
|
-
|
|
208
|
-
log.error(err.message);
|
|
210
|
+
console.error(err);
|
|
209
211
|
// 回滚更改
|
|
210
|
-
rollbackChanges(tagName, isDryRun);
|
|
212
|
+
rollbackChanges(tagName, isDryRun, lastCommitHash);
|
|
211
213
|
process.exit(1);
|
|
212
214
|
}
|
|
213
215
|
}
|
|
@@ -272,16 +274,44 @@ export async function main() {
|
|
|
272
274
|
process.exit(0);
|
|
273
275
|
}
|
|
274
276
|
const isDryRun = args.isDryRun;
|
|
275
|
-
// 如果有未提交的更改,则报错退出
|
|
276
|
-
if (!isDryRun && !checkGitStatus()) {
|
|
277
|
-
log.error('请先提交或暂存当前更改再发布。');
|
|
278
|
-
process.exit(1);
|
|
279
|
-
}
|
|
280
277
|
const packageManager = detectPackageManager();
|
|
281
278
|
const isWorkspace = isWorkspaceProject();
|
|
282
279
|
log.info('当前包管理器', packageManager);
|
|
283
280
|
log.info('当前工作目录', process.cwd());
|
|
284
281
|
log.info('当前运行模式', isDryRun ? 'dry-run' : 'publish');
|
|
282
|
+
const isSubmit = checkGitStatus();
|
|
283
|
+
log.info('当前工作目录状态', isSubmit ? '已提交' : '未提交');
|
|
284
|
+
// 记录当前最新的提交哈希,用于回滚
|
|
285
|
+
let lastCommitHash = '';
|
|
286
|
+
// 如果不是试运行模式,记录当前最新的提交哈希
|
|
287
|
+
if (!isDryRun) {
|
|
288
|
+
try {
|
|
289
|
+
// 获取最新提交的哈希值
|
|
290
|
+
lastCommitHash = execSync('git rev-parse HEAD').toString().trim();
|
|
291
|
+
log.info('当前最新一条提交', lastCommitHash);
|
|
292
|
+
}
|
|
293
|
+
catch (err) {
|
|
294
|
+
console.error(err);
|
|
295
|
+
log.warn('无法获取当前GIT提交信息');
|
|
296
|
+
process.exit(1);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// 如果有未提交的更改,则报错退出
|
|
300
|
+
if (!isDryRun && !isSubmit) {
|
|
301
|
+
log.error('请先提交或暂存当前更改再发布。');
|
|
302
|
+
process.exit(1);
|
|
303
|
+
}
|
|
304
|
+
log.info('检查npm登录状态...↙️');
|
|
305
|
+
try {
|
|
306
|
+
runCommand(`npm whoami --registry https://registry.npmjs.org/`);
|
|
307
|
+
}
|
|
308
|
+
catch (err) {
|
|
309
|
+
if (err?.stderr) {
|
|
310
|
+
log.error(err?.stderr.toString()); // 输出 npm 的错误提示
|
|
311
|
+
}
|
|
312
|
+
log.error('您未登录 npm。请先运行:npm login --registry https://registry.npmjs.org/');
|
|
313
|
+
process.exit(1);
|
|
314
|
+
}
|
|
285
315
|
if (isWorkspace) {
|
|
286
316
|
log.info('检测到 workspace 项目');
|
|
287
317
|
const packages = getWorkspacePackages();
|
|
@@ -316,11 +346,11 @@ export async function main() {
|
|
|
316
346
|
}
|
|
317
347
|
selectedPackage = packages[index - 1];
|
|
318
348
|
}
|
|
319
|
-
await publishPackage(selectedPackage.path, packageManager, isDryRun, args);
|
|
349
|
+
await publishPackage(selectedPackage.path, packageManager, isDryRun, args, lastCommitHash);
|
|
320
350
|
}
|
|
321
351
|
else {
|
|
322
352
|
// 单包项目,发布根目录
|
|
323
|
-
await publishPackage('.', packageManager, isDryRun, args);
|
|
353
|
+
await publishPackage('.', packageManager, isDryRun, args, lastCommitHash);
|
|
324
354
|
}
|
|
325
355
|
}
|
|
326
356
|
// 执行主函数
|
package/dist/utils.d.ts
CHANGED
|
@@ -82,8 +82,9 @@ export declare function runCommand(cmd: string, isDryRun?: boolean): void;
|
|
|
82
82
|
* 回滚代码变更的函数
|
|
83
83
|
* @param tagName - 可选的标签名称,用于删除创建的标签
|
|
84
84
|
* @param isDryRun - 是否为试运行模式,默认为false
|
|
85
|
+
* @param lastCommitHash
|
|
85
86
|
*/
|
|
86
|
-
export declare function rollbackChanges(tagName
|
|
87
|
+
export declare function rollbackChanges(tagName: string | undefined, isDryRun: boolean, lastCommitHash: string): void;
|
|
87
88
|
/**
|
|
88
89
|
* 更新指定包的版本号
|
|
89
90
|
* @param pkgPath - 包的文件路径
|
package/dist/utils.js
CHANGED
|
@@ -341,13 +341,14 @@ export function runCommand(cmd, isDryRun = false) {
|
|
|
341
341
|
* 回滚代码变更的函数
|
|
342
342
|
* @param tagName - 可选的标签名称,用于删除创建的标签
|
|
343
343
|
* @param isDryRun - 是否为试运行模式,默认为false
|
|
344
|
+
* @param lastCommitHash
|
|
344
345
|
*/
|
|
345
|
-
export function rollbackChanges(tagName, isDryRun
|
|
346
|
+
export function rollbackChanges(tagName, isDryRun, lastCommitHash) {
|
|
346
347
|
// 输出警告信息,提示用户正在回滚
|
|
347
348
|
log.warn('发生错误,正在回滚...');
|
|
348
349
|
try {
|
|
349
350
|
// 执行git命令,回退到上一个提交
|
|
350
|
-
runCommand(
|
|
351
|
+
runCommand(`git reset --hard ${lastCommitHash}`, isDryRun);
|
|
351
352
|
}
|
|
352
353
|
catch {
|
|
353
354
|
// 捕获并忽略执行过程中的错误
|