@vitarx/release-cli 1.0.0 → 1.0.2
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 +32 -21
- package/dist/release.js +34 -14
- package/dist/type.d.ts +2 -0
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +10 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
|
|
19
19
|
### 全局安装
|
|
20
20
|
|
|
21
|
+
安装时使用包名 `@vitarx/release-cli`,安装后使用命令名 `release-cli`:
|
|
22
|
+
|
|
21
23
|
```bash
|
|
22
24
|
# 使用 npm
|
|
23
25
|
npm install -g @vitarx/release-cli
|
|
@@ -31,6 +33,8 @@ yarn global add @vitarx/release-cli
|
|
|
31
33
|
|
|
32
34
|
### 临时使用 (无需安装)
|
|
33
35
|
|
|
36
|
+
临时使用时使用包名 `@vitarx/release-cli`:
|
|
37
|
+
|
|
34
38
|
```bash
|
|
35
39
|
# 使用 npx
|
|
36
40
|
npx @vitarx/release-cli
|
|
@@ -48,41 +52,42 @@ yarn dlx @vitarx/release-cli
|
|
|
48
52
|
|
|
49
53
|
```bash
|
|
50
54
|
# 发布当前包 (自动检测包管理器)
|
|
51
|
-
|
|
55
|
+
release-cli # 如果是 workspace 项目,会以对话形式选择要发布的包
|
|
52
56
|
|
|
53
57
|
# 指定包名发布 (workspace 项目)
|
|
54
|
-
|
|
58
|
+
release-cli --package my-package #发布包名为my-package的包
|
|
59
|
+
release-cli --package packages/my-package #发布在packages/my-package下的包
|
|
55
60
|
|
|
56
61
|
# 使用 dry-run 模式测试
|
|
57
|
-
|
|
62
|
+
release-cli --dry-run
|
|
58
63
|
|
|
59
64
|
# 指定版本类型
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
65
|
+
release-cli patch
|
|
66
|
+
release-cli minor
|
|
67
|
+
release-cli major
|
|
63
68
|
# 自定义版本号
|
|
64
|
-
|
|
69
|
+
release-cli 1.0.1
|
|
65
70
|
```
|
|
66
71
|
|
|
67
72
|
### 高级用法
|
|
68
73
|
|
|
69
74
|
```bash
|
|
70
75
|
# 组合使用选项
|
|
71
|
-
|
|
72
|
-
|
|
76
|
+
release-cli patch --dry-run --package my-package
|
|
77
|
+
release-cli minor --verbose
|
|
73
78
|
|
|
74
79
|
# 预发布版本
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
80
|
+
release-cli prerelease --preid alpha
|
|
81
|
+
release-cli prerelease --preid beta
|
|
82
|
+
release-cli prerelease --preid rc
|
|
78
83
|
|
|
79
84
|
# 从预发布升级到正式版本
|
|
80
|
-
|
|
85
|
+
release-cli release
|
|
81
86
|
|
|
82
87
|
# changelog 相关选项
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
88
|
+
release-cli patch --preset conventionalcommits --infile HISTORY.md
|
|
89
|
+
release-cli minor --no-same-file --output-unreleased
|
|
90
|
+
release-cli major --tag-prefix "v" --release-count 5
|
|
86
91
|
```
|
|
87
92
|
|
|
88
93
|
### 支持的版本类型
|
|
@@ -101,6 +106,7 @@ yarn dlx @vitarx/release-cli
|
|
|
101
106
|
|
|
102
107
|
| 选项 | 缩写 | 描述 | 默认值 |
|
|
103
108
|
|-----------------------|------|--------------------------|----------------|
|
|
109
|
+
| `--version` | `-v` | 显示版本信息 | - |
|
|
104
110
|
| `--help` | `-h` | 显示帮助信息 | - |
|
|
105
111
|
| `--dry-run` | `-d` | 试运行模式,不实际执行操作 | `false` |
|
|
106
112
|
| `--preid` | - | 预发布版本标识符(alpha/beta/rc) | - |
|
|
@@ -117,19 +123,24 @@ yarn dlx @vitarx/release-cli
|
|
|
117
123
|
| `--context` | `-c` | 模板变量上下文文件 | - |
|
|
118
124
|
| `--commit-path` | - | 只生成指定目录的提交日志 | - |
|
|
119
125
|
| `--tag-prefix` | - | Git 标签前缀 | `v` |
|
|
120
|
-
| `--verbose` |
|
|
126
|
+
| `--verbose` | - | 详细输出模式 | `false` |
|
|
121
127
|
| `--release-count` | - | 生成的发布记录数量 | `0` |
|
|
122
|
-
| `--package` | - |
|
|
128
|
+
| `--package` | - | 指定要发布的包名/包相对路径 | - |
|
|
123
129
|
|
|
124
130
|
### Workspace 支持
|
|
125
131
|
|
|
126
132
|
如果你的项目是 workspace 项目(包含 `workspaces` 配置),工具会自动检测并让你选择要发布的包。
|
|
127
133
|
|
|
128
|
-
你可以使用 `--package`
|
|
134
|
+
你可以使用 `--package` 选项直接指定要发布的包名或目录名,避免交互式选择:
|
|
129
135
|
|
|
130
136
|
```bash
|
|
131
|
-
|
|
132
|
-
|
|
137
|
+
# 按包名指定
|
|
138
|
+
release-cli --package my-package
|
|
139
|
+
release-cli patch --package my-package --dry-run
|
|
140
|
+
|
|
141
|
+
# 按目录名指定(workspace项目)
|
|
142
|
+
release-cli --package lib
|
|
143
|
+
release-cli --package app
|
|
133
144
|
```
|
|
134
145
|
|
|
135
146
|
## 发布流程
|
package/dist/release.js
CHANGED
|
@@ -15,6 +15,7 @@ function parseArgs() {
|
|
|
15
15
|
const result = {
|
|
16
16
|
isDryRun: false, // 是否为试运行模式
|
|
17
17
|
showHelp: false, // 是否显示帮助信息
|
|
18
|
+
showVersion: false, // 是否显示版本信息
|
|
18
19
|
changelogPreset: 'angular', // 更改日志预设模板
|
|
19
20
|
changelogInfile: 'CHANGELOG.md', // 更改日志输入文件
|
|
20
21
|
changelogSameFile: true, // 是否使用同一文件
|
|
@@ -27,6 +28,9 @@ function parseArgs() {
|
|
|
27
28
|
if (arg === '--help' || arg === '-h') {
|
|
28
29
|
result.showHelp = true;
|
|
29
30
|
}
|
|
31
|
+
else if (arg === '--version' || arg === '-v') {
|
|
32
|
+
result.showVersion = true;
|
|
33
|
+
}
|
|
30
34
|
else if (arg === '--dry-run' || arg === '-d') {
|
|
31
35
|
result.isDryRun = true;
|
|
32
36
|
}
|
|
@@ -75,7 +79,7 @@ function parseArgs() {
|
|
|
75
79
|
else if (arg === '--tag-prefix' && args[i + 1]) {
|
|
76
80
|
result.changelogTagPrefix = args[++i];
|
|
77
81
|
}
|
|
78
|
-
else if (arg === '--verbose'
|
|
82
|
+
else if (arg === '--verbose') {
|
|
79
83
|
result.changelogVerbose = true;
|
|
80
84
|
}
|
|
81
85
|
else if (arg === '--package' && args[i + 1]) {
|
|
@@ -133,14 +137,17 @@ async function publishPackage(pkgDir, packageManager, isDryRun = false, args) {
|
|
|
133
137
|
runCommand(`npm run build --prefix ${pkgDir}`);
|
|
134
138
|
// -------------------- Step 5: 生成日志 --------------------
|
|
135
139
|
// 是否为根包
|
|
136
|
-
const isRootPackage = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8')).name ===
|
|
140
|
+
const isRootPackage = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8')).name ===
|
|
141
|
+
pkg.name;
|
|
137
142
|
if (isRootPackage) {
|
|
138
143
|
// 生成 changelog
|
|
139
144
|
try {
|
|
140
145
|
log.info(`📝 正在生成 CHANGELOG.md...`);
|
|
141
146
|
const changelogArgs = [
|
|
142
|
-
'-p',
|
|
143
|
-
|
|
147
|
+
'-p',
|
|
148
|
+
args.changelogPreset || 'angular',
|
|
149
|
+
'-i',
|
|
150
|
+
args.changelogInfile || 'CHANGELOG.md',
|
|
144
151
|
args.changelogOutfile ? ['-o', args.changelogOutfile] : '',
|
|
145
152
|
args.changelogSameFile ? '-s' : '',
|
|
146
153
|
args.changelogAppend ? '-a' : '',
|
|
@@ -152,8 +159,11 @@ async function publishPackage(pkgDir, packageManager, isDryRun = false, args) {
|
|
|
152
159
|
args.changelogCommitPath ? ['--commit-path', args.changelogCommitPath] : '',
|
|
153
160
|
args.changelogTagPrefix ? ['-t', args.changelogTagPrefix] : '',
|
|
154
161
|
args.changelogVerbose ? '-v' : '',
|
|
155
|
-
'-r',
|
|
156
|
-
|
|
162
|
+
'-r',
|
|
163
|
+
args.changelogReleaseCount ? args.changelogReleaseCount.toString() : '0'
|
|
164
|
+
]
|
|
165
|
+
.flat()
|
|
166
|
+
.filter((arg) => arg !== '');
|
|
157
167
|
runCommand(`conventional-changelog ${changelogArgs.join(' ')}`, isDryRun);
|
|
158
168
|
}
|
|
159
169
|
catch {
|
|
@@ -209,8 +219,14 @@ async function publishPackage(pkgDir, packageManager, isDryRun = false, args) {
|
|
|
209
219
|
*/
|
|
210
220
|
export async function main() {
|
|
211
221
|
const args = parseArgs();
|
|
222
|
+
// 显示版本信息
|
|
223
|
+
if (args.showVersion) {
|
|
224
|
+
const { version } = JSON.parse(fs.readFileSync(path.join(path.dirname(path.dirname(import.meta.url)), 'package.json'), 'utf-8'));
|
|
225
|
+
log.info('release-cli v' + version);
|
|
226
|
+
process.exit(0);
|
|
227
|
+
}
|
|
228
|
+
console.log(chalk.cyan('📦 Release CLI - NPM包发布工具'));
|
|
212
229
|
if (args.showHelp) {
|
|
213
|
-
console.log(chalk.cyan('📦 Release CLI - NPM包发布工具'));
|
|
214
230
|
console.log('');
|
|
215
231
|
console.log(chalk.yellow('使用方法:'));
|
|
216
232
|
console.log(' release-cli [版本类型] [选项]');
|
|
@@ -228,6 +244,7 @@ export async function main() {
|
|
|
228
244
|
console.log('');
|
|
229
245
|
console.log(chalk.yellow('选项:'));
|
|
230
246
|
console.log(' -h, --help - 显示帮助信息');
|
|
247
|
+
console.log(' -v, --version - 输出版本号');
|
|
231
248
|
console.log(' -d, --dry-run - 试运行模式,不实际执行操作,(默认false)');
|
|
232
249
|
console.log(' --preid <标识符> - 预发布版本标识符(alpha/beta/rc)');
|
|
233
250
|
console.log(' --preset <预设> - conventional-changelog预设(默认: angular)');
|
|
@@ -243,9 +260,9 @@ export async function main() {
|
|
|
243
260
|
console.log(' -c, --context <文件> - 模板变量上下文文件');
|
|
244
261
|
console.log(' --commit-path <目录> - 只生成指定目录的提交日志');
|
|
245
262
|
console.log(' --tag-prefix <前缀> - Git 标签前缀(默认: v)');
|
|
246
|
-
console.log('
|
|
263
|
+
console.log(' --verbose - 详细输出模式');
|
|
247
264
|
console.log(' --release-count <数量> - 生成的发布记录数量(默认: 0)');
|
|
248
|
-
console.log(' --package <包名> -
|
|
265
|
+
console.log(' --package <包名> - 指定要发布的包名/包相对路径');
|
|
249
266
|
console.log('');
|
|
250
267
|
console.log(chalk.yellow('示例:'));
|
|
251
268
|
console.log(' release-cli patch --dry-run');
|
|
@@ -261,9 +278,9 @@ export async function main() {
|
|
|
261
278
|
}
|
|
262
279
|
const packageManager = detectPackageManager();
|
|
263
280
|
const isWorkspace = isWorkspaceProject();
|
|
264
|
-
log.info(
|
|
265
|
-
log.info(
|
|
266
|
-
log.info(
|
|
281
|
+
log.info('当前包管理器', packageManager);
|
|
282
|
+
log.info('当前工作目录', process.cwd());
|
|
283
|
+
log.info('当前运行模式', isDryRun ? 'dry-run' : 'publish');
|
|
267
284
|
if (isWorkspace) {
|
|
268
285
|
log.info('检测到 workspace 项目');
|
|
269
286
|
const packages = getWorkspacePackages();
|
|
@@ -273,8 +290,11 @@ export async function main() {
|
|
|
273
290
|
}
|
|
274
291
|
let selectedPackage;
|
|
275
292
|
if (args.packageName) {
|
|
276
|
-
//
|
|
277
|
-
selectedPackage = packages.find(pkg =>
|
|
293
|
+
// 如果指定了包名,查找对应的包(支持按包名或目录名匹配)
|
|
294
|
+
selectedPackage = packages.find((pkg) => {
|
|
295
|
+
console.log(`正在匹配 ${path.basename(pkg.path)}`);
|
|
296
|
+
return pkg.name === args.packageName || path.basename(pkg.path) === args.packageName;
|
|
297
|
+
});
|
|
278
298
|
if (!selectedPackage) {
|
|
279
299
|
log.error(`未找到包名为 ${args.packageName} 的包`);
|
|
280
300
|
process.exit(1);
|
package/dist/type.d.ts
CHANGED
package/dist/utils.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export declare function checkGitStatus(): boolean;
|
|
|
20
20
|
* @property warn - 警告日志
|
|
21
21
|
*/
|
|
22
22
|
export declare const log: {
|
|
23
|
-
readonly info: (message: string) => void;
|
|
23
|
+
readonly info: (message: string, ...text: string[]) => void;
|
|
24
24
|
readonly success: (message: string) => void;
|
|
25
25
|
readonly error: (message: string) => void;
|
|
26
26
|
readonly warn: (message: string) => void;
|
package/dist/utils.js
CHANGED
|
@@ -49,17 +49,22 @@ export function checkGitStatus() {
|
|
|
49
49
|
* @property warn - 警告日志
|
|
50
50
|
*/
|
|
51
51
|
export const log = {
|
|
52
|
-
info: (message) => {
|
|
53
|
-
|
|
52
|
+
info: (message, ...text) => {
|
|
53
|
+
if (text.length) {
|
|
54
|
+
console.log(chalk.cyan(`📢 ${message}: `), ...text);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
console.log(`📢 ${message}`);
|
|
58
|
+
}
|
|
54
59
|
},
|
|
55
60
|
success: (message) => {
|
|
56
|
-
console.log(chalk.green(
|
|
61
|
+
console.log(chalk.green(`✅ ${message}`));
|
|
57
62
|
},
|
|
58
63
|
error: (message) => {
|
|
59
|
-
console.log(chalk.red(
|
|
64
|
+
console.log(chalk.red(`❌ ${message}`));
|
|
60
65
|
},
|
|
61
66
|
warn: (message) => {
|
|
62
|
-
console.log(chalk.yellow(
|
|
67
|
+
console.log(chalk.yellow(`⚠️ ${message}`));
|
|
63
68
|
}
|
|
64
69
|
};
|
|
65
70
|
/**
|