1 | const fs = require('fs');
|
2 | const fse = require("fs-extra");
|
3 | const path = require('path');
|
4 | const ora = require('ora');
|
5 | const inquirer = require('inquirer');
|
6 | const unzipper = require("unzipper");
|
7 | const utils = require('../utils');
|
8 | const config = require('../../config');
|
9 | const logger = require('../utils/logger');
|
10 |
|
11 | const backupMethod = {
|
12 | backDirs() {
|
13 | return [
|
14 | "src",
|
15 |
|
16 | "platforms/android/eeuiApp/app/src/main/assets/eeui",
|
17 | "platforms/ios/eeuiApp/bundlejs/eeui",
|
18 |
|
19 | "platforms/android/eeuiApp/app/src/main/res/mipmap-hdpi",
|
20 | "platforms/android/eeuiApp/app/src/main/res/mipmap-ldpi",
|
21 | "platforms/android/eeuiApp/app/src/main/res/mipmap-mdpi",
|
22 | "platforms/android/eeuiApp/app/src/main/res/mipmap-xhdpi",
|
23 | "platforms/android/eeuiApp/app/src/main/res/mipmap-xxhdpi",
|
24 | "platforms/android/eeuiApp/app/src/main/res/mipmap-xxxhdpi",
|
25 |
|
26 | "platforms/android/eeuiApp/app/src/main/res/drawable",
|
27 | "platforms/android/eeuiApp/app/src/main/res/drawable-land-hdpi",
|
28 | "platforms/android/eeuiApp/app/src/main/res/drawable-land-ldpi",
|
29 | "platforms/android/eeuiApp/app/src/main/res/drawable-land-mdpi",
|
30 | "platforms/android/eeuiApp/app/src/main/res/drawable-land-xhdpi",
|
31 | "platforms/android/eeuiApp/app/src/main/res/drawable-land-xxhdpi",
|
32 | "platforms/android/eeuiApp/app/src/main/res/drawable-land-xxxhdpi",
|
33 | "platforms/android/eeuiApp/app/src/main/res/drawable-port-hdpi",
|
34 | "platforms/android/eeuiApp/app/src/main/res/drawable-port-ldpi",
|
35 | "platforms/android/eeuiApp/app/src/main/res/drawable-port-mdpi",
|
36 | "platforms/android/eeuiApp/app/src/main/res/drawable-port-xhdpi",
|
37 | "platforms/android/eeuiApp/app/src/main/res/drawable-port-xxhdpi",
|
38 | "platforms/android/eeuiApp/app/src/main/res/drawable-port-xxxhdpi",
|
39 |
|
40 | "platforms/android/eeuiApp/android.jks",
|
41 | "platforms/android/eeuiApp/gradle.properties",
|
42 | "platforms/ios/eeuiApp/eeuiApp/Info.plist",
|
43 |
|
44 | "platforms/ios/eeuiApp/eeuiApp/Assets.xcassets/AppIcon.appiconset",
|
45 | "platforms/ios/eeuiApp/eeuiApp/Assets.xcassets/LaunchImage.launchimage",
|
46 | ];
|
47 | },
|
48 |
|
49 | backup(callback, ignore) {
|
50 | let startBack = () => {
|
51 | let backupPath = path.resolve(config.backupDir);
|
52 | utils.mkdirsSync(backupPath);
|
53 |
|
54 | let dirLists = this.backDirs();
|
55 | if (ignore instanceof Array) {
|
56 | ignore.forEach((item) => {
|
57 | dirLists.some((dir, index) => {
|
58 | if (item === dir) {
|
59 | dirLists.splice(index, 1);
|
60 | return true;
|
61 | }
|
62 | });
|
63 | })
|
64 | }
|
65 | let entry = [];
|
66 | dirLists.forEach((item) => {
|
67 | entry.push({
|
68 | type: "dir",
|
69 | root: process.cwd(),
|
70 | path: path.join(process.cwd(), item)
|
71 | });
|
72 | });
|
73 | entry.push({
|
74 | type: "file",
|
75 | root: process.cwd(),
|
76 | path: path.join(process.cwd(), "eeui.config.js"),
|
77 | });
|
78 |
|
79 | let loading = ora('正在备份...').start();
|
80 | utils.zipCompress({
|
81 | output: path.join(backupPath, utils.formatDate("YmdHis") + ".zip"),
|
82 | entry: entry
|
83 | }, (output, err) => {
|
84 | loading.stop();
|
85 | if (err) {
|
86 | if (typeof callback === "function") {
|
87 | callback(false, err);
|
88 | } else {
|
89 | logger.fatal(`备份失败:${err}`);
|
90 | }
|
91 | } else {
|
92 | if (typeof callback === "function") {
|
93 | callback(true, output);
|
94 | } else {
|
95 | logger.success(`备份成功:${output}`);
|
96 | }
|
97 | }
|
98 | });
|
99 | };
|
100 | if (typeof callback === "function") {
|
101 | startBack();
|
102 | } else {
|
103 | inquirer.prompt([{
|
104 | type: 'confirm',
|
105 | message: `确定备份项目开发文件吗?(含:页面、图标、启动页、eeui.config.js)`,
|
106 | name: 'ok',
|
107 | }]).then(answers => {
|
108 | if (answers.ok) {
|
109 | startBack();
|
110 | } else {
|
111 | logger.fatal(`放弃备份!`);
|
112 | }
|
113 | }).catch(console.error);
|
114 | }
|
115 | },
|
116 |
|
117 | recovery() {
|
118 | let backupPath = path.resolve(config.backupDir);
|
119 | utils.mkdirsSync(backupPath);
|
120 | let count = utils.count(backupPath);
|
121 | let lists = utils.fileDirDisplay(backupPath, true);
|
122 | let choices = [];
|
123 | for (let index in lists.file) {
|
124 | if (!lists.file.hasOwnProperty(index)) continue;
|
125 | let tmp = lists.file[index];
|
126 | choices.push(tmp.substr(count + 1));
|
127 | }
|
128 | if (choices.length === 0) {
|
129 | logger.fatal(`未找到备份文件!`);
|
130 | }
|
131 | let array = [{
|
132 | type: 'list',
|
133 | name: 'bakname',
|
134 | message: `请选择要恢复的备份文件:`,
|
135 | choices: choices.reverse()
|
136 | }];
|
137 | inquirer.prompt(array).then(function(answers) {
|
138 | inquirer.prompt([{
|
139 | type: 'confirm',
|
140 | message: `您确定恢复备份文件 ${answers.bakname} 吗?(注意:此操作不可撤销)`,
|
141 | name: 'ok',
|
142 | }]).then(confirm => {
|
143 | if (confirm.ok) {
|
144 | let zipFile = path.join(backupPath, answers.bakname);
|
145 | if (!fs.existsSync(zipFile)) {
|
146 | logger.fatal(`恢复失败:备份文件 ${answers.bakname} 不存在!`);
|
147 | }
|
148 | backupMethod.recoveryHandler(zipFile, (res, msg) => {
|
149 | if (res) {
|
150 | logger.success(`恢复成功:${answers.bakname}`);
|
151 | }else{
|
152 | logger.fatal(`恢复失败:${answers.bakname}!`);
|
153 | }
|
154 | });
|
155 | }
|
156 | }).catch(console.error);
|
157 | });
|
158 | },
|
159 |
|
160 | recoveryHandler(zipFile, callback, ignore) {
|
161 | let dirLists = this.backDirs();
|
162 | if (ignore instanceof Array) {
|
163 | ignore.forEach((item) => {
|
164 | dirLists.some((dir, index) => {
|
165 | if (item === dir) {
|
166 | dirLists.splice(index, 1);
|
167 | return true;
|
168 | }
|
169 | });
|
170 | })
|
171 | }
|
172 | dirLists.forEach((dir) => {
|
173 | fse.removeSync(path.join(process.cwd(), dir));
|
174 | });
|
175 |
|
176 | fs.createReadStream(zipFile).pipe(unzipper.Extract({path: process.cwd()})).on('error', (err) => {
|
177 | callback(false, err)
|
178 | }).on('finish', () => {
|
179 | callback(true, null);
|
180 | });
|
181 | },
|
182 |
|
183 | updateMainFrame(releasePath, projectPath, projectVersion) {
|
184 | let updatePathLists = [
|
185 | 'platforms/android',
|
186 | 'platforms/ios',
|
187 | 'plugins/eeui/framework',
|
188 | 'plugins/eeui/WeexSDK',
|
189 | ];
|
190 | if (!utils.versionFunegt(projectVersion, "2.3.0")) {
|
191 | updatePathLists.push('babel.config.js');
|
192 | updatePathLists.push('gulpfile.js');
|
193 | updatePathLists.push('webpack.config.js');
|
194 | }
|
195 | let filterFileLists = [
|
196 | "platforms/android/eeuiApp/local.properties",
|
197 | ];
|
198 | let filterFileContent = [];
|
199 |
|
200 | try {
|
201 | filterFileLists.forEach((file) => {
|
202 | let projectFile = path.join(projectPath, file);
|
203 | if (fs.existsSync(projectFile)) {
|
204 | filterFileContent.push({
|
205 | "file": projectFile,
|
206 | "content": fs.readFileSync(projectFile, 'utf8')
|
207 | })
|
208 | }
|
209 | });
|
210 | updatePathLists.forEach((dir) => {
|
211 | let releaseDir = path.join(releasePath, dir);
|
212 | let projectDir = path.join(projectPath, dir);
|
213 | fse.removeSync(projectDir);
|
214 | fse.copySync(releaseDir, projectDir);
|
215 | });
|
216 | filterFileContent.forEach((item) => {
|
217 | utils.mkdirsSync(path.dirname(item.file));
|
218 | fs.writeFileSync(item.file, item.content, 'utf8');
|
219 | });
|
220 | } catch (err) {
|
221 | logger.fatal(`升级新版本文件失败:${err}`);
|
222 | }
|
223 | },
|
224 | };
|
225 |
|
226 | module.exports = backupMethod;
|