@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 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
- @vitarx/release-cli # 如果是 workspace 项目,会以对话形式选择要发布的包
55
+ release-cli # 如果是 workspace 项目,会以对话形式选择要发布的包
52
56
 
53
57
  # 指定包名发布 (workspace 项目)
54
- @vitarx/release-cli --package <包名>
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
- @vitarx/release-cli --dry-run
62
+ release-cli --dry-run
58
63
 
59
64
  # 指定版本类型
60
- @vitarx/release-cli patch
61
- @vitarx/release-cli minor
62
- @vitarx/release-cli major
65
+ release-cli patch
66
+ release-cli minor
67
+ release-cli major
63
68
  # 自定义版本号
64
- @vitarx/release-cli 1.0.1
69
+ release-cli 1.0.1
65
70
  ```
66
71
 
67
72
  ### 高级用法
68
73
 
69
74
  ```bash
70
75
  # 组合使用选项
71
- @vitarx/release-cli patch --dry-run --package my-package
72
- @vitarx/release-cli minor --verbose
76
+ release-cli patch --dry-run --package my-package
77
+ release-cli minor --verbose
73
78
 
74
79
  # 预发布版本
75
- @vitarx/release-cli prerelease --preid alpha
76
- @vitarx/release-cli prerelease --preid beta
77
- @vitarx/release-cli prerelease --preid rc
80
+ release-cli prerelease --preid alpha
81
+ release-cli prerelease --preid beta
82
+ release-cli prerelease --preid rc
78
83
 
79
84
  # 从预发布升级到正式版本
80
- @vitarx/release-cli release
85
+ release-cli release
81
86
 
82
87
  # changelog 相关选项
83
- @vitarx/release-cli patch --preset conventionalcommits --infile HISTORY.md
84
- @vitarx/release-cli minor --no-same-file --output-unreleased
85
- @vitarx/release-cli major --tag-prefix "" --release-count 5
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` | `-v` | 详细输出模式 | `false` |
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
- @vitarx/release-cli --package my-package
132
- @vitarx/release-cli patch --package my-package --dry-run
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' || arg === '-v') {
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 === pkg.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', args.changelogPreset || 'angular',
143
- '-i', args.changelogInfile || 'CHANGELOG.md',
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', args.changelogReleaseCount ? args.changelogReleaseCount.toString() : '0'
156
- ].flat().filter(arg => arg !== '');
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(' -v, --verbose - 详细输出模式');
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(`当前包管理器: ${packageManager}`);
265
- log.info(`当前工作目录: ${process.cwd()}`);
266
- log.info(`当前运行模式: ${isDryRun ? 'dry-run' : 'publish'}`);
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 => pkg.name === args.packageName);
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
@@ -59,4 +59,6 @@ export interface ReleaseConfig {
59
59
  changelogVerbose?: boolean;
60
60
  /** 是否显示帮助信息 */
61
61
  showHelp: boolean;
62
+ /** 是否显示版本信息 */
63
+ showVersion: boolean;
62
64
  }
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
- console.log(chalk.cyan(`Info:${message}`));
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(`Success:✅ ${message}`));
61
+ console.log(chalk.green(`✅ ${message}`));
57
62
  },
58
63
  error: (message) => {
59
- console.log(chalk.red(`Error:❌ ${message}`));
64
+ console.log(chalk.red(`❌ ${message}`));
60
65
  },
61
66
  warn: (message) => {
62
- console.log(chalk.yellow(`Warn:⚠️ ${message}`));
67
+ console.log(chalk.yellow(`⚠️ ${message}`));
63
68
  }
64
69
  };
65
70
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitarx/release-cli",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "A CLI tool for automated npm package release with workspace support",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",