UNPKG

10.8 kBJavaScriptView Raw
1import config from "../config";
2import rimraf from "rimraf";
3import { spawn } from "child_process";
4import path from "path";
5import fs from "fs";
6import { copyFiles, readJson, mkdirs, runCommands } from "node-pearls";
7import console from "cli-console";
8import $branch from "../gitlab/branch";
9
10/**
11 * 将版本规则解析为固定的打包版本号
12 * @param {string} versionRule - 版本规则
13 * @param {string} packageVersion - 当前安装项目的版本
14 * @description
15 目前支持的版本规则如下(参见语义化版本semver):
16 1.2.3 - 指定版本,模块打包后为 name/1.2.3/...
17 波浪线~ - 自动升级版本,例如 ~1.2.3 模块打包后为 name/1.2/...
18 补注号^(默认) - 自动升级版本,例如 ^1.2.3 模块打包后为 name/1/...
19 x范围 - 自动升级版本,例如 1.2.x 模块打包后为 name/1.2/...
20 其他规则 - 转换为当前安装项目的版本,不自动升级
21 */
22function parseVersion (versionRule){
23 var originalVersionRule = versionRule;
24 versionRule = versionRule.split("-")[0];
25
26 if(/^\d+\.\d+\.\d+$/.test(versionRule)){
27 return originalVersionRule;
28 }else if(/^\~\d+(\.\d+){0,2}$/.test(versionRule)){
29 return versionRule.replace(/^\~/, "").split(".").slice(0, 2).join(".");
30 }else if(/^\^\d+(\.\d+){0,2}$/.test(versionRule)){
31 versionRule = versionRule.replace(/^\^/, "").split(".");
32 return versionRule.slice(0, versionRule.findIndex(item=>item!=0) + 1).join(".");
33 }else if(/^\d+(\.\d+)?\.x$/.test(versionRule)){
34 return versionRule.replace(/\.x$/, "");
35 }else{
36 console.warn(`版本规则${versionRule}暂时不支持`);
37 return "";
38 }
39}
40
41export default async function(options){
42 //
43 const platforms = options.platforms ? options.platforms.split(",").map(platform => platform.trim()) : [];
44 // 临时enjoy项目名
45 const tempProjectName = "FrameworkBundle";
46 // 创建的临时项目地址
47 const tempProjectPath = path.join(config["tmp-dir"], tempProjectName);
48
49 // 删除原有的项目
50 rimraf.sync(tempProjectPath);
51 // 创建指定版本的临时项目
52 var initCommandArgus = [];
53 if(options.version && typeof options.version === "string"){
54 initCommandArgus.push(`--version ${options.version}`);
55 }
56 var depPlatforms = [];
57 var hasRn = platforms.some(platform => ["ios", "android"].indexOf(platform) !== -1);
58 if(hasRn){
59 depPlatforms = ["rn"].concat(platforms.filter(platform => ["ios", "android"].indexOf(platform) === -1));
60 }else{
61 depPlatforms = platforms;
62 }
63 initCommandArgus.push(`--platforms ${depPlatforms.join(",")}`);
64
65 mkdirs.sync(config["tmp-dir"]);
66 try{
67 await runCommands([`enjoy init ${tempProjectName} --logs --pure`].concat(initCommandArgus).join(" "), {
68 cwd: config["tmp-dir"]
69 });
70 }catch(e){
71 console.log(e);
72 }
73 try{
74 // 锁定cli版本
75 await runCommands("npm shrinkwrap", {
76 cwd: tempProjectPath
77 });
78 }catch(e){
79 console.log(e);
80 }
81 try{
82 // 锁定support版本
83 await Promise.all(depPlatforms.map(platform => (async () => {
84 await runCommands("npm shrinkwrap", {
85 cwd: platform === "rn" ? path.join(tempProjectPath, "rn") : path.join(tempProjectPath, config["group-hash"][platform], platform)
86 });
87 })()));
88 }catch(e){
89 console.log(e);
90 }
91 // 打包各个平台
92 await Promise.all(platforms.map(platform => (async () => {
93 let group = config["group-hash"][platform];
94 let platformDir = path.join(tempProjectPath, group, platform);
95 let saveGitName = "framework-bundle";
96 let saveGitPath = path.join(platformDir, saveGitName);
97 let nodeModulesDir = group === "rn" ? path.join(tempProjectPath, group) : platformDir;
98 let supportModuleName = group === "rn"
99 ?
100 "enjoy-rn-support-elong"
101 :
102 platform === "h5"
103 ?
104 "enjoy-web-support-elong"
105 :
106 `enjoy-${platform}-support-elong`;
107 let platformVersion = parseVersion(readJson.sync(path.join(nodeModulesDir, "package.json")).dependencies[supportModuleName]);
108 let branchName = `${platform}@${platformVersion}`;
109 // 检查项目的指定分支是否存在,如果不存在则创建此分支
110 if(!await $branch.exists(saveGitName, branchName)){
111 await $branch.create(saveGitName, branchName);
112 }
113 // 克隆存储git仓库指定平台分支
114 rimraf.sync(saveGitPath);
115 await runCommands(`git clone git@code.corp.elong.com:enjoy/framework-bundle.git ${saveGitPath} -b ${branchName} --depth 1`);
116 // 拷贝锁定版本
117 try{
118 await copyFiles([{
119 src: path.join(tempProjectPath, "npm-shrinkwrap.json"),
120 dist: path.join(saveGitPath, "npm-shrinkwrap.cli.json")
121 },{
122 src: path.join(nodeModulesDir, "npm-shrinkwrap.json"),
123 dist: path.join(saveGitPath, "npm-shrinkwrap.support.json")
124 }]);
125 }catch(e){
126 console.log(e);
127 }
128
129 if(group === "rn"){
130 let bundleDir = path.join(platformDir, "bundle", "combo");
131 console.title(`打${platform}平台dev包`);
132 // 打包dev
133 await runCommands(`enjoy bundle --framework --${platform}`, {
134 cwd: tempProjectPath
135 });
136 console.title(`拷贝${platform}平台dev包`);
137 // 拷贝打包结果
138 await copyFiles([
139 "framework.js",
140 "framework.debug.js"
141 ].map((file) => {
142 return {
143 src: path.join(bundleDir, file),
144 dist: path.join(saveGitPath, file.replace(/framework/, "index.dev"))
145 };
146 }));
147 console.title(`打${platform}平台release包`);
148 // 打包release
149 await runCommands(`enjoy bundle --framework --${platform} --release`, {
150 cwd: tempProjectPath
151 });
152 console.title(`拷贝${platform}平台release包`);
153 // 拷贝打包结果
154 await copyFiles([
155 "framework.js",
156 "framework.js.map",
157 "framework.debug.js",
158 "framework.debug.js.map"
159 ].map((file) => {
160 return {
161 src: path.join(bundleDir, file),
162 dist: path.join(saveGitPath, file.replace(/framework/, "index"))
163 };
164 }));
165 }else{
166 let bundleDir = path.join(platformDir, "bundle");
167 console.title("打dev包");
168 // 打dev包
169 await runCommands(`enjoy bundle --framework --${platform}`, {
170 cwd: tempProjectPath
171 });
172 console.title("拷贝dev包");
173 await copyFiles([
174 "framework.zip",
175 "framework.files"
176 ].map((file) => {
177 return {
178 src: path.join(bundleDir, file),
179 dist: path.join(saveGitPath, file.replace(/framework/, "index.dev"))
180 };
181 }));
182 console.title("打dev combo包");
183 // 打dev combo包
184 await runCommands(`enjoy bundle --framework --${platform} --combo`, {
185 cwd: tempProjectPath
186 });
187 console.title("拷贝dev combo包");
188 await copyFiles([
189 "framework.js"
190 ].map((file) => {
191 return {
192 src: path.join(bundleDir, "combo", file),
193 dist: path.join(saveGitPath, file.replace(/framework/, "index.dev"))
194 };
195 }));
196 console.title("打release包");
197 // 打release包
198 await runCommands(`enjoy bundle --framework --${platform} --release`, {
199 cwd: tempProjectPath
200 });
201 console.title("拷贝release包");
202 await copyFiles([
203 "framework.zip",
204 "framework.files"
205 ].map((file) => {
206 return {
207 src: path.join(bundleDir, file),
208 dist: path.join(saveGitPath, file.replace(/framework/, "index"))
209 };
210 }));
211 console.title("打release combo包");
212 // 打release combo包
213 await runCommands(`enjoy bundle --framework --${platform} --release --combo`, {
214 cwd: tempProjectPath
215 });
216 console.title("拷贝release combo包");
217 await copyFiles([
218 "framework.js",
219 "framework.js.map"
220 ].map((file) => {
221 return {
222 src: path.join(bundleDir, "combo", file),
223 dist: path.join(saveGitPath, file.replace(/framework/, "index"))
224 };
225 }));
226 }
227
228 console.title("升级版本号");
229 // 更新版本号
230 const version = (() => {
231 let packageJsonFile = path.join(saveGitPath, "package.json");
232 let packageJson = readJson.sync(packageJsonFile);
233 let modName = `enjoy-bundle-framework-${platform}`;
234 if(packageJson.name !== modName){
235 packageJson.name = modName;
236 packageJson.version = (function(versions){
237 for(let i = 0; i < 3; i ++){
238 if(!versions[i]){
239 versions[i] = "0";
240 }
241 }
242 return versions.join(".");
243 })(platformVersion.split("."));
244 }else{
245 let version = packageJson.version.split(".");
246 version[version.length - 1] = +version[version.length - 1] + 1;
247 version = version.join(".");
248 packageJson.version = version;
249 }
250 fs.writeFileSync(packageJsonFile, JSON.stringify(packageJson, null, " "));
251 return packageJson.version;
252 })();
253
254 console.title("发布npm");
255 await runCommands(`npm publish --registry https://registry.npmjs.org/`, {
256 cwd: saveGitPath
257 });
258 //
259 console.title("提交git");
260 await runCommands(`
261 git add .
262 git commit -m "${version}"
263 git push
264 `, {
265 cwd: saveGitPath
266 });
267 })()));
268
269 console.success("打包完成");
270}
271