1 | const fs = require('fs');
|
2 | const fse = require("fs-extra");
|
3 | const path = require('path');
|
4 | const ora = require('ora');
|
5 | const chalk = require('chalk');
|
6 | const inquirer = require('inquirer');
|
7 | const lodash = require("lodash");
|
8 | const logger = require('./logger');
|
9 | const config = require("../../config");
|
10 | const backup = require("./backup");
|
11 | const utils = require("./index");
|
12 | const project = require("./project");
|
13 | const expand = require("./expand");
|
14 | const plugin = require("../plugin/index");
|
15 |
|
16 | const TemplateRelease = require("../../template-release");
|
17 | const templateRelease = new TemplateRelease(config.cacheDirName, config.templateReleaseUrl);
|
18 |
|
19 | function start() {
|
20 | let projectPath = path.resolve(process.cwd());
|
21 | let releaseFile = path.resolve(projectPath, ".eeui.release");
|
22 | let releaseConfig = utils.jsonParse(!fs.existsSync(releaseFile) ? {} : fs.readFileSync(releaseFile, 'utf8'));
|
23 |
|
24 | let projectVersion = utils.projectVersion();
|
25 | let newRelease = '';
|
26 | let spinFetch = ora('正在获取版本列表...');
|
27 | spinFetch.start();
|
28 | templateRelease.fetchReleaseVersions((err, result) => {
|
29 | spinFetch.stop();
|
30 | if (err) {
|
31 | logger.fatal(err);
|
32 | }
|
33 | newRelease = result[0];
|
34 | let isLatest = false;
|
35 | if (!utils.versionFunegt(newRelease, projectVersion)) {
|
36 | logger.success(`当前版本(${projectVersion})已是最新版本。`);
|
37 | isLatest = true;
|
38 | }
|
39 |
|
40 | let questions = [{
|
41 | type: 'confirm',
|
42 | message: isLatest ? (`确定重新安装主框架吗?(${newRelease})`) : (`确定开始升级主框架吗?(${projectVersion} -> ${newRelease})`),
|
43 | name: 'ok',
|
44 | }];
|
45 | if (!utils.isHave(releaseConfig.appName)) {
|
46 | let applicationid = "";
|
47 | questions.push({
|
48 | type: 'input',
|
49 | name: 'appName',
|
50 | default: function () {
|
51 | return 'eeui演示';
|
52 | },
|
53 | message: "请输入App名称",
|
54 | validate: function (value) {
|
55 | return value !== ''
|
56 | }
|
57 | }, {
|
58 | type: 'input',
|
59 | name: 'applicationID',
|
60 | default: function () {
|
61 | return releaseConfig.applicationID || 'app.eeui.simple';
|
62 | },
|
63 | message: "请输入Android应用ID",
|
64 | validate: function (value) {
|
65 | let pass = value.match(/^[a-zA-Z_][a-zA-Z0-9_]*[.][a-zA-Z_][a-zA-Z0-9_]*[.][a-zA-Z_][a-zA-Z0-9_]+$/);
|
66 | if (pass) {
|
67 | applicationid = value;
|
68 | return true;
|
69 | }
|
70 | return '输入格式错误,请重新输入。';
|
71 | }
|
72 | }, {
|
73 | type: 'input',
|
74 | name: 'bundleIdentifier',
|
75 | default: function () {
|
76 | return releaseConfig.bundleIdentifier || applicationid;
|
77 | },
|
78 | message: "请输入iOS应用ID",
|
79 | validate: function (value) {
|
80 | let pass = value.match(/^[a-zA-Z_][a-zA-Z0-9_]*[.][a-zA-Z_][a-zA-Z0-9_]*[.][a-zA-Z_][a-zA-Z0-9_]+$/);
|
81 | if (pass) {
|
82 | return true;
|
83 | }
|
84 | return '输入格式错误,请重新输入。';
|
85 | }
|
86 | });
|
87 | }
|
88 | questions.push({
|
89 | type: 'list',
|
90 | name: 'location',
|
91 | message: "请选择下载服务器",
|
92 | choices: [{
|
93 | name: "Github服务器",
|
94 | value: "github"
|
95 | }, {
|
96 | name: "EEUI官网服务器",
|
97 | value: "eeui"
|
98 | }]
|
99 | });
|
100 | inquirer.prompt(questions).then(answers => {
|
101 | if (answers.ok) {
|
102 | logger.info(`开始升级至:${newRelease}`);
|
103 | let originalData = {
|
104 | android: {
|
105 | versionCode: expand.androidGradle("versionCode"),
|
106 | versionName: expand.androidGradle("versionName"),
|
107 | },
|
108 | ios: {
|
109 | CFBundleVersion: expand.iosInfo("CFBundleVersion"),
|
110 | CFBundleShortVersionString: expand.iosInfo("CFBundleShortVersionString"),
|
111 | }
|
112 | };
|
113 | if (!utils.isHave(releaseConfig.release)) {
|
114 | releaseConfig = lodash.merge(releaseConfig, answers);
|
115 | }
|
116 | templateRelease.fetchRelease(newRelease, answers.location, function (error, releasePath) {
|
117 | if (error) {
|
118 | logger.fatal(error);
|
119 | }
|
120 | let releasePackageFile = path.resolve(releasePath, "package.json");
|
121 | if (fs.existsSync(releasePackageFile)) {
|
122 | let releasePackageInfo = utils.jsonParse(fs.readFileSync(releasePackageFile, 'utf8'));
|
123 | let current = require('../../package.json').version;
|
124 | let eeuiclimin = releasePackageInfo.eeuiclimin;
|
125 | if (utils.isHave(eeuiclimin) && utils.versionFunegt(eeuiclimin, current)) {
|
126 | logger.fatal(`当前${chalk.underline(`eeui-cli@${current}`)}版本过低,无法进行升级,请升级至${chalk.underline(`eeui-cli@${eeuiclimin}`)}或以上!${chalk.underline(`https://www.npmjs.com/package/eeui-cli`)}`);
|
127 | }
|
128 | }
|
129 | logger.info(`备份项目开发文件...`);
|
130 | backup.backup((ret, backPath) => {
|
131 | if (!ret) {
|
132 | logger.fatal(`备份失败:${backPath}`);
|
133 | }
|
134 | logger.info(`备份成功`);
|
135 | logger.info(`升级新版本文件...`);
|
136 | backup.updateMainFrame(releasePath, projectPath, projectVersion);
|
137 | logger.info(`升级成功`);
|
138 | logger.info(`恢复项目开发文件...`);
|
139 | backup.recoveryHandler(backPath, (rec, msg) => {
|
140 | if (!rec) {
|
141 | logger.fatal(`恢复失败:${msg}`);
|
142 | }
|
143 | logger.info(`恢复成功`);
|
144 | fse.removeSync(backPath);
|
145 |
|
146 | releaseConfig.release = newRelease;
|
147 | project.initConfig(projectPath, releaseConfig);
|
148 | expand.androidGradle("versionCode", originalData.android.versionCode);
|
149 | expand.androidGradle("versionName", originalData.android.versionName);
|
150 | expand.iosInfo("CFBundleVersion", originalData.ios.CFBundleVersion);
|
151 | expand.iosInfo("CFBundleShortVersionString", originalData.ios.CFBundleShortVersionString);
|
152 |
|
153 | plugin.repair(() => {
|
154 | let packageFile = path.resolve(process.cwd(), "package.json");
|
155 | if (fs.existsSync(packageFile)) {
|
156 | let packageInfo = fs.readFileSync(packageFile, 'utf8');
|
157 | let releasePackageFile = path.resolve(releasePath, "package.json");
|
158 | if (fs.existsSync(releasePackageFile)) {
|
159 | let releasePackageInfo = utils.jsonParse(fs.readFileSync(releasePackageFile, 'utf8'));
|
160 | let projectPackageInfo = utils.jsonParse(packageInfo);
|
161 | fs.writeFileSync(packageFile, JSON.stringify(lodash.merge(projectPackageInfo, releasePackageInfo), null, "\t"), 'utf8')
|
162 | }else{
|
163 | packageInfo = packageInfo.replace(/"version"\s*:\s*"(.*?)"/g, `"version": "${newRelease}"`);
|
164 | fs.writeFileSync(packageFile, packageInfo, 'utf8')
|
165 | }
|
166 | }
|
167 |
|
168 | logger.success(`主框架升级至最新版本(${newRelease})成功。`);
|
169 | logger.sep();
|
170 | logger.info("您可以运行一下命令开始。");
|
171 | logger.info(chalk.white(`1. npm install`));
|
172 | logger.info(chalk.white(`2. npm run dev`));
|
173 | });
|
174 | }, ['src']);
|
175 | }, ['src']);
|
176 | });
|
177 | } else {
|
178 | logger.fatal(isLatest ? `放弃操作!` : `放弃升级!`);
|
179 | }
|
180 | }).catch(console.error);
|
181 | });
|
182 | }
|
183 |
|
184 | module.exports = {start};
|