flu-cli 0.0.5 → 2.0.1
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/CLI.md +512 -0
- package/README.md +70 -260
- package/config/dev.config.js +56 -0
- package/config/templates.js +147 -0
- package/index.js +177 -81
- package/lib/commands/add.js +595 -0
- package/lib/commands/cache.js +99 -0
- package/lib/commands/completion.js +92 -0
- package/lib/commands/config.js +70 -0
- package/lib/commands/newClack.js +399 -0
- package/lib/commands/snippets.js +39 -0
- package/lib/commands/template.js +113 -0
- package/lib/commands/templates.js +84 -0
- package/lib/generators/model_generator.js +303 -0
- package/lib/generators/page_generator.js +322 -0
- package/lib/generators/project_generator.js +96 -0
- package/lib/generators/service_generator.js +408 -0
- package/lib/generators/state_manager_generator.js +402 -0
- package/lib/generators/viewmodel_generator.js +115 -0
- package/lib/generators/widget_generator.js +104 -0
- package/lib/templates/templateCopier.js +296 -0
- package/lib/templates/templateManager.js +191 -0
- package/lib/utils/config.js +99 -0
- package/lib/utils/flutterHelper.js +85 -0
- package/lib/utils/index_updater.js +69 -0
- package/lib/utils/logger.js +57 -0
- package/lib/utils/project_detector.js +227 -0
- package/lib/utils/snippet_loader.js +32 -0
- package/lib/utils/string_helper.js +56 -0
- package/lib/utils/templateSelectorEnquirer.js +203 -0
- package/package.json +34 -7
- package/release.sh +107 -0
- package/scripts/e2e-state-tests.js +116 -0
- package/scripts/sync-base-to-templates.js +108 -0
- package/scripts/workspace-clone-all.sh +101 -0
- package/scripts/workspace-status-all.sh +112 -0
- package/templates/README.md +138 -0
- package/templates/base_files/base_list_page.dart.template +174 -0
- package/templates/base_files/base_list_viewmodel.dart.template +134 -0
- package/templates/base_files/base_page.dart.template +251 -0
- package/templates/base_files/base_viewmodel.dart.template +77 -0
- package/templates/base_files/theme/status_views_theme.dart.template +46 -0
- package/templates/snippets/dart.code-snippets +392 -0
- package/lib/createProject.js +0 -220
- package/lib/flutterProjectCreator.js +0 -80
- package/lib/libCopier.js +0 -368
- package/lib/userInteraction.js +0 -274
- package/lib/utils.js +0 -200
- package/publish.sh +0 -29
package/lib/userInteraction.js
DELETED
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 用户交互模块
|
|
3
|
-
*
|
|
4
|
-
* 包含所有与用户交互相关的函数
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import inquirer from 'inquirer';
|
|
9
|
-
const { prompt } = inquirer;
|
|
10
|
-
import { existsSync } from 'fs';
|
|
11
|
-
|
|
12
|
-
import { join } from 'path';
|
|
13
|
-
import { printColored, validatePackageName, validateProjectName } from './utils.js';
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* 用户交互功能集合
|
|
19
|
-
*/
|
|
20
|
-
export const getUserInteraction = {
|
|
21
|
-
/**
|
|
22
|
-
* 获取项目类型
|
|
23
|
-
*
|
|
24
|
-
* @returns {Promise<string>} 'app' 或 'module'
|
|
25
|
-
*/
|
|
26
|
-
getProjectType: async () => {
|
|
27
|
-
|
|
28
|
-
const { projectType } = await prompt([
|
|
29
|
-
{
|
|
30
|
-
type: 'list',
|
|
31
|
-
name: 'projectType',
|
|
32
|
-
message: '请选择项目类型:',
|
|
33
|
-
choices: [
|
|
34
|
-
{ name: '应用 (app)', value: 'app', },
|
|
35
|
-
{ name: '模块 (module)', value: 'module', },
|
|
36
|
-
{ name: '原生插件 (plugin)', value: 'plugin', },
|
|
37
|
-
{ name: '插件 (package)', value: 'package', }
|
|
38
|
-
],
|
|
39
|
-
default: 'app'
|
|
40
|
-
}
|
|
41
|
-
]);
|
|
42
|
-
return projectType;
|
|
43
|
-
},
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* 获取模板类型
|
|
47
|
-
*
|
|
48
|
-
* @returns {Promise<string>} 'only' 或 'min' 或 'normal' 或 'pro'
|
|
49
|
-
*/
|
|
50
|
-
getTemplateType: async () => {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const { templateType } = await prompt([
|
|
55
|
-
{
|
|
56
|
-
type: 'list',
|
|
57
|
-
name: 'templateType',
|
|
58
|
-
message: '请选择项目模版:',
|
|
59
|
-
choices: [
|
|
60
|
-
{ name: 'only (main.dart)', value: 'only' },
|
|
61
|
-
{ name: 'min (项目结构、路由管理、主题管理、状态管理、工具集)', value: 'min' },
|
|
62
|
-
{ name: 'normal (项目结构、路由管理、主题管理、状态管理、工具集、UI组件库)', value: 'normal' },
|
|
63
|
-
{ name: 'pro (项目结构、路由管理、主题管理、状态管理、工具集、UI组件库、网络请求、数据缓存、示例模块)', value: 'pro' }
|
|
64
|
-
],
|
|
65
|
-
default: 'pro'
|
|
66
|
-
}
|
|
67
|
-
]);
|
|
68
|
-
return templateType;
|
|
69
|
-
},
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* 获取状态管理
|
|
73
|
-
*
|
|
74
|
-
* @returns {Promise<string>} 'state' 或 'GetX'
|
|
75
|
-
*/
|
|
76
|
-
getStateManager: async () => {
|
|
77
|
-
const { stateManager } = await prompt([
|
|
78
|
-
{
|
|
79
|
-
type: 'list',
|
|
80
|
-
name: 'stateManager',
|
|
81
|
-
message: '请选择状态管理:',
|
|
82
|
-
choices: [
|
|
83
|
-
{ name: 'state (State)', value: 'state' },
|
|
84
|
-
{ name: 'get (GetX)', value: 'GetX' },
|
|
85
|
-
],
|
|
86
|
-
default: 'state'
|
|
87
|
-
}
|
|
88
|
-
]);
|
|
89
|
-
return stateManager;
|
|
90
|
-
},
|
|
91
|
-
|
|
92
|
-
getIsNeedDemo: async () => {
|
|
93
|
-
const { isNeedDemo } = await prompt([
|
|
94
|
-
{
|
|
95
|
-
type: 'confirm',
|
|
96
|
-
name: 'isNeedDemo',
|
|
97
|
-
message: '是否需要使用事例:',
|
|
98
|
-
default: true
|
|
99
|
-
}
|
|
100
|
-
])
|
|
101
|
-
return isNeedDemo;
|
|
102
|
-
},
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* 获取项目信息
|
|
106
|
-
*
|
|
107
|
-
* @param {string} projectType - 项目类型 ('app'或'module')
|
|
108
|
-
* @param {string} defaultProjectName - 默认项目名称
|
|
109
|
-
* @param {string} defaultPackageName - 默认包名
|
|
110
|
-
* @param {string} defaultParentDir - 默认父目录
|
|
111
|
-
* @returns {Promise<Object>} 项目信息对象
|
|
112
|
-
*/
|
|
113
|
-
getProjectInfo: async (projectType, defaultProjectName, defaultPackageName, defaultParentDir, flutterSdkPath) => {
|
|
114
|
-
// 获取项目名称
|
|
115
|
-
let projectName = defaultProjectName;
|
|
116
|
-
if (!defaultProjectName) {
|
|
117
|
-
defaultProjectName = getDefaultProjectName(projectType);
|
|
118
|
-
const res = await prompt([
|
|
119
|
-
{
|
|
120
|
-
type: 'input',
|
|
121
|
-
name: 'projectName',
|
|
122
|
-
message: '请输入新项目名称(小写字母、数字和下划线):',
|
|
123
|
-
default: defaultProjectName,
|
|
124
|
-
validate: validateProjectName
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
]);
|
|
128
|
-
projectName = res.projectName;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// 获取Flutter SDK路径
|
|
132
|
-
if (!flutterSdkPath) {
|
|
133
|
-
flutterSdkPath = await getFlutterSdkPath();
|
|
134
|
-
}
|
|
135
|
-
// 获取包名
|
|
136
|
-
let packageName = defaultPackageName;
|
|
137
|
-
if (!defaultPackageName) {
|
|
138
|
-
defaultPackageName = `com.example.${projectName}`;
|
|
139
|
-
const res = await prompt([
|
|
140
|
-
{
|
|
141
|
-
type: 'input',
|
|
142
|
-
name: 'packageName',
|
|
143
|
-
message: '请输入包名:',
|
|
144
|
-
default: defaultPackageName || `com.example.${projectName}`,
|
|
145
|
-
validate: validatePackageName
|
|
146
|
-
}
|
|
147
|
-
]);
|
|
148
|
-
packageName = res.packageName;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
// 获取父目录
|
|
154
|
-
let parentDir = defaultParentDir;
|
|
155
|
-
if (!defaultParentDir) {
|
|
156
|
-
defaultParentDir = process.cwd();
|
|
157
|
-
const res = await prompt([
|
|
158
|
-
{
|
|
159
|
-
type: 'input',
|
|
160
|
-
name: 'parentDir',
|
|
161
|
-
message: '请输入项目存放路径:',
|
|
162
|
-
default: defaultParentDir
|
|
163
|
-
}
|
|
164
|
-
]);
|
|
165
|
-
parentDir = res.parentDir;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
const targetDir = join(parentDir, projectName);
|
|
169
|
-
console.log('flutterPath:', flutterSdkPath);
|
|
170
|
-
return {
|
|
171
|
-
projectName,
|
|
172
|
-
packageName,
|
|
173
|
-
parentDir,
|
|
174
|
-
targetDir,
|
|
175
|
-
flutterSdkPath
|
|
176
|
-
};
|
|
177
|
-
},
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* 确认是否覆盖已存在的目录
|
|
181
|
-
*
|
|
182
|
-
* @param {string} targetDir - 目标目录路径
|
|
183
|
-
* @returns {Promise<boolean>} 是否覆盖
|
|
184
|
-
*/
|
|
185
|
-
confirmOverwrite: async (targetDir) => {
|
|
186
|
-
printColored(`\n警告: 目标目录 ${targetDir} 已存在!`, 'yellow');
|
|
187
|
-
|
|
188
|
-
const { overwrite } = await prompt([
|
|
189
|
-
{
|
|
190
|
-
type: 'confirm',
|
|
191
|
-
name: 'overwrite',
|
|
192
|
-
message: '是否覆盖?',
|
|
193
|
-
default: false
|
|
194
|
-
}
|
|
195
|
-
]);
|
|
196
|
-
|
|
197
|
-
if (overwrite) {
|
|
198
|
-
printColored("将覆盖目标目录", 'red');
|
|
199
|
-
} else {
|
|
200
|
-
printColored("操作已取消", 'green');
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
return overwrite;
|
|
204
|
-
},
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* 获取用户选择的IDE类型
|
|
208
|
-
*
|
|
209
|
-
* @returns {Promise<string>} IDE类型
|
|
210
|
-
*/
|
|
211
|
-
getIdeChoice: async () => {
|
|
212
|
-
const { ideChoice } = await prompt([
|
|
213
|
-
{
|
|
214
|
-
type: 'list',
|
|
215
|
-
name: 'ideChoice',
|
|
216
|
-
message: '请选择要打开项目的IDE:',
|
|
217
|
-
choices: [
|
|
218
|
-
{ name: 'Visual Studio Code', value: 'vscode' },
|
|
219
|
-
{ name: 'Android Studio', value: 'android_studio' },
|
|
220
|
-
{ name: '打开文件夹', value: 'open_folder' },
|
|
221
|
-
{ name: '不打开', value: 'manual' }
|
|
222
|
-
],
|
|
223
|
-
default: 'vscode'
|
|
224
|
-
}
|
|
225
|
-
]);
|
|
226
|
-
|
|
227
|
-
return ideChoice;
|
|
228
|
-
}
|
|
229
|
-
};
|
|
230
|
-
|
|
231
|
-
async function getFlutterSdkPath () {
|
|
232
|
-
const { path: sdkPath } = await prompt([{
|
|
233
|
-
type: 'input',
|
|
234
|
-
name: 'path',
|
|
235
|
-
|
|
236
|
-
message: '请输入Flutter SDK路径(留空使用系统默认):',
|
|
237
|
-
validate: input => !input || existsSync(join(input, 'bin/flutter'))
|
|
238
|
-
}]);
|
|
239
|
-
return sdkPath || 'flutter';
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* 获取默认项目名称
|
|
244
|
-
*
|
|
245
|
-
* @param {string} projectType - 项目类型 ('app'或'module')
|
|
246
|
-
* @returns {string} 默认项目名称
|
|
247
|
-
*/
|
|
248
|
-
function getDefaultProjectName (projectType) {
|
|
249
|
-
let defaultProjectName = 'project';
|
|
250
|
-
switch (projectType) {
|
|
251
|
-
case 'app':
|
|
252
|
-
defaultProjectName = 'project';
|
|
253
|
-
break;
|
|
254
|
-
case 'module':
|
|
255
|
-
defaultProjectName = 'module';
|
|
256
|
-
break;
|
|
257
|
-
case 'package':
|
|
258
|
-
defaultProjectName = 'package';
|
|
259
|
-
break;
|
|
260
|
-
case 'plugin':
|
|
261
|
-
defaultProjectName = 'plugin';
|
|
262
|
-
break;
|
|
263
|
-
default:
|
|
264
|
-
defaultProjectName = 'example';
|
|
265
|
-
break;
|
|
266
|
-
}
|
|
267
|
-
return "hzy_example_" + defaultProjectName;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
export default {
|
|
271
|
-
getFlutterSdkPath,
|
|
272
|
-
getDefaultProjectName,
|
|
273
|
-
getUserInteraction
|
|
274
|
-
};
|
package/lib/utils.js
DELETED
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 工具函数模块
|
|
3
|
-
*
|
|
4
|
-
* 包含项目创建过程中所需的各种实用工具函数,如模板分支计算、彩色输出、
|
|
5
|
-
* 验证函数、README生成和IDE打开等功能
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import chalk from 'chalk';
|
|
9
|
-
const { red: _red, green: _green, yellow: _yellow, blue: _blue, magenta, cyan: _cyan, bold } = chalk;
|
|
10
|
-
import fsExtra from 'fs-extra';
|
|
11
|
-
const { writeFileSync } = fsExtra;
|
|
12
|
-
import { join, resolve } from 'path';
|
|
13
|
-
import { exec } from 'child_process';
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* 计算模板分支名称
|
|
18
|
-
*
|
|
19
|
-
* 根据模板类型和状态管理组合生成Git仓库分支名称
|
|
20
|
-
* 用于从Git仓库获取对应类型的项目模板
|
|
21
|
-
*
|
|
22
|
-
* @param {string} templateType - 模板类型 (only, min, normal, pro)
|
|
23
|
-
* @param {string} stateManager - 状态管理类型 (state, GetX, Provider等)
|
|
24
|
-
* @returns {string} 组合后的模板分支名称
|
|
25
|
-
*/
|
|
26
|
-
export function getTemplateBranch (templateType, stateManager) {
|
|
27
|
-
if (stateManager == '') {
|
|
28
|
-
return templateType;
|
|
29
|
-
}
|
|
30
|
-
return templateType + "-" + stateManager;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* 打印彩色文本到控制台
|
|
35
|
-
*
|
|
36
|
-
* 支持多种颜色输出,用于区分不同类型的提示信息(成功、错误、警告等)
|
|
37
|
-
* 使用chalk库实现颜色渲染,并自动添加粗体效果
|
|
38
|
-
*
|
|
39
|
-
* @param {string} text - 要打印的文本内容
|
|
40
|
-
* @param {string} color - 文本颜色,可选值: red, green, yellow, blue, purple, cyan
|
|
41
|
-
*/
|
|
42
|
-
export function printColored (text, color) {
|
|
43
|
-
const colorMap = {
|
|
44
|
-
red: _red,
|
|
45
|
-
green: _green,
|
|
46
|
-
yellow: _yellow,
|
|
47
|
-
blue: _blue,
|
|
48
|
-
purple: magenta,
|
|
49
|
-
cyan: _cyan
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
console.log(bold(colorMap[color] ? colorMap[color](text) : text));
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* 验证项目名称是否符合Flutter项目命名规范
|
|
57
|
-
*
|
|
58
|
-
* Flutter要求项目名称必须以小写字母开头,只能包含小写字母、数字和下划线
|
|
59
|
-
* 不符合规范时返回具体错误信息,符合时返回true
|
|
60
|
-
*
|
|
61
|
-
* @param {string} name - 待验证的项目名称
|
|
62
|
-
* @returns {boolean|string} 验证结果,true表示有效,字符串表示错误信息
|
|
63
|
-
*/
|
|
64
|
-
export function validateProjectName (name) {
|
|
65
|
-
if (!name.match(/^[a-z][a-z0-9_]*$/)) {
|
|
66
|
-
return '错误: 项目名称必须以小写字母开头,只能包含小写字母、数字和下划线';
|
|
67
|
-
}
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* 验证包名是否符合Java包名规范
|
|
73
|
-
*
|
|
74
|
-
* 包名必须以小写字母开头,可包含小写字母、数字、下划线和点号,点号用于分隔层级
|
|
75
|
-
* 不符合规范时返回具体错误信息,符合时返回true
|
|
76
|
-
*
|
|
77
|
-
* @param {string} name - 待验证的包名
|
|
78
|
-
* @returns {boolean|string} 验证结果,true表示有效,字符串表示错误信息
|
|
79
|
-
*/
|
|
80
|
-
export function validatePackageName (name) {
|
|
81
|
-
if (!name.match(/^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)*$/)) {
|
|
82
|
-
return '错误: 包名必须符合Java包名规范,如com.example.myapp';
|
|
83
|
-
}
|
|
84
|
-
return true;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* 生成并更新项目的README.md文件
|
|
89
|
-
*
|
|
90
|
-
* 创建包含项目基本信息和快速开始指南的README文件
|
|
91
|
-
* 包含项目名称、创建日期、包名和基本命令说明
|
|
92
|
-
*
|
|
93
|
-
* @param {string} targetDir - 项目根目录路径
|
|
94
|
-
* @param {string} projectName - 项目名称
|
|
95
|
-
* @param {string} packageName - 项目包名
|
|
96
|
-
*/
|
|
97
|
-
export function updateReadme (targetDir, projectName, packageName) {
|
|
98
|
-
const currentDate = new Date().toISOString().split('T')[0];
|
|
99
|
-
const readmePath = join(targetDir, 'README.md');
|
|
100
|
-
|
|
101
|
-
const readmeContent = `# ${projectName}
|
|
102
|
-
|
|
103
|
-
基于火之夜工作室 Flutter 通用项目框架创建的应用
|
|
104
|
-
|
|
105
|
-
## 项目信息
|
|
106
|
-
|
|
107
|
-
- 项目名称: ${projectName}
|
|
108
|
-
- 包名: ${packageName}
|
|
109
|
-
- 创建日期: ${currentDate}
|
|
110
|
-
|
|
111
|
-
## 项目结构
|
|
112
|
-
|
|
113
|
-
- lib/: 主要代码目录
|
|
114
|
-
- assets/: 静态资源目录
|
|
115
|
-
- pubspec.yaml: 项目依赖配置
|
|
116
|
-
|
|
117
|
-
## 快速开始
|
|
118
|
-
|
|
119
|
-
\`\`\`bash
|
|
120
|
-
# 安装依赖
|
|
121
|
-
flutter pub get
|
|
122
|
-
|
|
123
|
-
# 运行项目 (默认调试模式)
|
|
124
|
-
flutter run
|
|
125
|
-
|
|
126
|
-
# 构建发布版本
|
|
127
|
-
flutter build appbundle
|
|
128
|
-
\`\`\`
|
|
129
|
-
|
|
130
|
-
## 功能特性
|
|
131
|
-
|
|
132
|
-
- 完整的项目结构
|
|
133
|
-
- 路由管理
|
|
134
|
-
- 主题管理
|
|
135
|
-
- 状态管理
|
|
136
|
-
- 网络请求封装
|
|
137
|
-
- 本地存储
|
|
138
|
-
`;
|
|
139
|
-
|
|
140
|
-
writeFileSync(readmePath, readmeContent, 'utf8');
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* 在指定IDE中自动打开项目
|
|
145
|
-
*
|
|
146
|
-
* 根据用户选择的IDE类型和当前操作系统,执行相应的命令打开项目
|
|
147
|
-
* 支持VS Code、Android Studio、文件管理器或手动打开
|
|
148
|
-
*
|
|
149
|
-
* @param {string} targetDir - 项目根目录绝对路径
|
|
150
|
-
* @param {string} [ideType="vscode"] - IDE类型,可选值: vscode, android_studio, open_folder, manual
|
|
151
|
-
*/
|
|
152
|
-
export function openProjectInIde (targetDir, ideType = "vscode") {
|
|
153
|
-
const platform = process.platform;
|
|
154
|
-
let command = null;
|
|
155
|
-
|
|
156
|
-
// 确保路径是绝对路径
|
|
157
|
-
targetDir = resolve(targetDir);
|
|
158
|
-
|
|
159
|
-
switch (ideType) {
|
|
160
|
-
case 'vscode':
|
|
161
|
-
command = `code "${targetDir}"`;
|
|
162
|
-
break;
|
|
163
|
-
case 'android_studio':
|
|
164
|
-
if (platform === 'darwin') { // macOS
|
|
165
|
-
command = `open -a "Android Studio" "${targetDir}"`;
|
|
166
|
-
} else if (platform === 'win32') { // Windows
|
|
167
|
-
// 在Windows上查找Android Studio路径会比较复杂
|
|
168
|
-
// 这里简化处理,实际应用中可能需要更复杂的逻辑
|
|
169
|
-
command = '"C:\\Program Files\\Android\\Android Studio\\bin\\studio64.exe" "${targetDir}"';
|
|
170
|
-
} else if (platform === 'linux') { // Linux
|
|
171
|
-
command = `studio "${targetDir}"`;
|
|
172
|
-
}
|
|
173
|
-
break;
|
|
174
|
-
case 'open_folder':
|
|
175
|
-
if (platform === 'darwin') { // macOS
|
|
176
|
-
command = `open "${targetDir}"`;
|
|
177
|
-
} else if (platform === 'win32') { // Windows
|
|
178
|
-
command = `explorer "${targetDir}"`;
|
|
179
|
-
} else if (platform === 'linux') { // Linux
|
|
180
|
-
command = `xdg-open "${targetDir}"`;
|
|
181
|
-
}
|
|
182
|
-
break;
|
|
183
|
-
case 'manual':
|
|
184
|
-
// 不执行任何命令
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
if (command) {
|
|
189
|
-
try {
|
|
190
|
-
exec(command, (error) => {
|
|
191
|
-
if (error) {
|
|
192
|
-
printColored(`无法打开IDE: ${error.message}`, 'yellow');
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
} catch (e) {
|
|
196
|
-
printColored(`打开IDE时发生错误: ${e.message}`, 'yellow');
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
package/publish.sh
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
set -e
|
|
3
|
-
|
|
4
|
-
# 检查是否有未提交的更改
|
|
5
|
-
if [[ -n $(git status -s) ]]; then
|
|
6
|
-
echo "Error: There are uncommitted changes. Please commit or stash them first."
|
|
7
|
-
exit 1
|
|
8
|
-
fi
|
|
9
|
-
|
|
10
|
-
# 更新版本号 (patch版本,如需其他类型可改为minor或major)
|
|
11
|
-
npm version patch --no-git-tag-version -m "chore: bump version to %s"
|
|
12
|
-
|
|
13
|
-
# 获取版本号并创建git tag
|
|
14
|
-
VERSION=$(node -p "require('./package.json').version")
|
|
15
|
-
git tag -a "v$VERSION" -m "Release v$VERSION"
|
|
16
|
-
|
|
17
|
-
# 获取当前分支名
|
|
18
|
-
BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)
|
|
19
|
-
if [[ -z "$BRANCH_NAME" ]]; then
|
|
20
|
-
echo "Error: Unable to determine current branch."
|
|
21
|
-
exit 1
|
|
22
|
-
fi
|
|
23
|
-
|
|
24
|
-
# 推送提交和标签到当前分支对应的远程分支
|
|
25
|
-
# 使用双引号防止通配符扩展和单词分割
|
|
26
|
-
git push origin "$BRANCH_NAME" --tags
|
|
27
|
-
|
|
28
|
-
# 发布到npm
|
|
29
|
-
npm publish
|