From df7f14c532ca0cac6eeb3bc8ab18cbbfe7d5ac4a Mon Sep 17 00:00:00 2001 From: zoumiaojiang Date: Mon, 3 Sep 2018 14:12:03 +0800 Subject: [PATCH] Feat: download template from CDN instead of git #113 (#197) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: download template from CDN instead of git #113 * bump to 2.2.10 * 更新lavas-core-vue的依赖版本号 --- package.json | 2 +- packages/lavas-cli/bin/dev-lavas-cli.js | 1 + packages/lavas-cli/package.json | 3 +- packages/lavas-cli/src/lib/scaffold/config.js | 2 + .../lavas-cli/src/lib/scaffold/template.js | 58 ++++++++----------- packages/lavas-cli/src/lib/utils/index.js | 8 +-- packages/lavas-core-vue/package.json | 4 +- 7 files changed, 36 insertions(+), 42 deletions(-) diff --git a/package.json b/package.json index aa8dc92..f62b991 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "webpack-bundle-analyzer": "^2.8.2", "webpack-chain": "4.8.0", "webpack-dev-middleware": "^1.12.0", - "webpack-hot-middleware": "^2.19.0", + "webpack-hot-middleware": "~2.22.0", "webpack-node-externals": "^1.6.0", "workbox-webpack-plugin": "^3.4.1" }, diff --git a/packages/lavas-cli/bin/dev-lavas-cli.js b/packages/lavas-cli/bin/dev-lavas-cli.js index 94c2a7c..5a44439 100755 --- a/packages/lavas-cli/bin/dev-lavas-cli.js +++ b/packages/lavas-cli/bin/dev-lavas-cli.js @@ -1,3 +1,4 @@ #!/usr/bin/env node +process.env.NODE_ENV = 'development'; require('../src/commander'); diff --git a/packages/lavas-cli/package.json b/packages/lavas-cli/package.json index 24ac06b..e1df2ab 100644 --- a/packages/lavas-cli/package.json +++ b/packages/lavas-cli/package.json @@ -1,6 +1,6 @@ { "name": "lavas", - "version": "2.2.9", + "version": "2.2.10", "description": "Lavas solution cli tool", "main": "dist/index.js", "files": [ @@ -38,6 +38,7 @@ "babel-runtime": "^6.26.0", "chalk": "^1.1.3", "commander": "^2.11.0", + "compressing": "^1.3.1", "connect-history-api-fallback": "^1.3.0", "etpl": "^3.2.0", "express": "^4.16.2", diff --git a/packages/lavas-cli/src/lib/scaffold/config.js b/packages/lavas-cli/src/lib/scaffold/config.js index 77dd3bb..94ee439 100644 --- a/packages/lavas-cli/src/lib/scaffold/config.js +++ b/packages/lavas-cli/src/lib/scaffold/config.js @@ -28,6 +28,8 @@ module.exports = { development: 'https://bos.nj.bpc.baidu.com/mms-res/lavas-scaffold/config_dev.json' }, + TAR_GZ_ENDPOINT: 'https://bos.nj.bpc.baidu.com/v1/assets/lavas/', + /** * render common data * diff --git a/packages/lavas-cli/src/lib/scaffold/template.js b/packages/lavas-cli/src/lib/scaffold/template.js index bfc1214..27a4008 100644 --- a/packages/lavas-cli/src/lib/scaffold/template.js +++ b/packages/lavas-cli/src/lib/scaffold/template.js @@ -6,57 +6,49 @@ /* eslint-disable fecs-prefer-async-await */ const fs = require('fs-extra'); const path = require('path'); -const os = require('os'); const glob = require('glob'); const archiver = require('archiver'); const etpl = require('etpl'); const Ajv = require('ajv'); -const exec = require('mz/child_process').exec; +const axios = require('axios'); +const compressing = require('compressing'); const conf = require('./config'); const getMeta = require('./getMeta'); const store = require('./store'); const schema = require('./schema'); -const utils = require('../utils'); const locals = require('../../locals')(); /** - * 从 git 上 download 代码下来 + * 通过指定框架名和模版名从服务器上拉取模版(要求在模版 relase 的时候注意上传的 CDN 路径) * - * @param {string} repo git repo - * @param {string} targetPath 存储的目标目录 - * @param {string} branchName 分支名 - * @return {Promise} promise 对象 + * @param {string} framework 框架名称 + * @param {string} template 模版名称 + * @param {string} targetPath 模版下载后存放路径 */ -async function downloadFromGit(repo, targetPath, branchName) { +async function downloadTemplateFromCloud(framework, template, targetPath) { + const outputFilename = path.resolve(targetPath, 'template.tar.gz'); + fs.existsSync(targetPath) && fs.removeSync(targetPath); + fs.mkdirsSync(targetPath); - if (!utils.hasCommand('git')) { - throw new Error(locals.NO_GIT_COMMAND + ',' + locals.NO_GIT_COMMAND_DESC); - } + framework = (framework || 'vue').toLowerCase(); + template = (template || 'basic').toLowerCase(); try { - // Fixed: windows 下跨盘 cd 命令,必须先要指定盘名 - let diskCommand = ''; - - if (os.platform() === 'win32') { - let diskName = targetPath.split(':')[0]; - if (diskName) { - diskCommand = diskName + ': &&'; + let result = await axios.request({ + responseType: 'arraybuffer', + url: `${conf.TAR_GZ_ENDPOINT}${framework}/${template}/templates.tar.gz`, + method: 'get', + headers: { + 'Content-Type': 'application/x-gzip' } - } + }); - // 如果当前文件系统有 download 的缓存,就不重新 clone 了,将代码直接 pull 下来就好了。 - if (fs.existsSync(targetPath) && fs.existsSync(path.resolve(targetPath, '.git'))) { - await exec(`${diskCommand}cd "${targetPath}" && git checkout ${branchName} && git pull`); - } - else { - fs.existsSync(targetPath) && fs.removeSync(targetPath); - fs.mkdirsSync(targetPath); - await exec(`git clone ${repo} "${targetPath}"`); - await exec(`${diskCommand}cd "${targetPath}" && git checkout ${branchName}`); - } + fs.writeFileSync(outputFilename, result.data); - return targetPath; + // 解压缩是反响过程,接口都统一为 uncompress + await compressing.tgz.uncompress(outputFilename, targetPath); + fs.removeSync(outputFilename); } catch (e) { throw new Error(locals.DOWNLOAD_TEMPLATE_ERROR); @@ -212,12 +204,10 @@ async function getTemplateInfo(metaParam) { */ exports.download = async function (metaParams = {}) { let {framework, template, version} = await getTemplateInfo(metaParams); - let gitRepo = template.git; let storeDir = path.resolve( conf.LOCAL_TEMPLATES_DIR, framework.value, template.value + '_' + version ); - let branchName = template.branch || 'master'; let ajv = new Ajv({allErrors: true}); let metaJsonSchema = store.get('metaJsonSchema') || await schema.getMetaJsonSchema(); let validate = ajv.compile(metaJsonSchema); @@ -227,7 +217,7 @@ exports.download = async function (metaParams = {}) { throw new Error(JSON.stringify(validate.errors)); } - await downloadFromGit(gitRepo, storeDir, branchName); + await downloadTemplateFromCloud(framework.value, template.value, storeDir); store.set('storeDir', storeDir); let templateConfigContent = fs.readFileSync(path.resolve(storeDir, 'meta.json'), 'utf-8'); diff --git a/packages/lavas-cli/src/lib/utils/index.js b/packages/lavas-cli/src/lib/utils/index.js index d1c42e6..7593f53 100644 --- a/packages/lavas-cli/src/lib/utils/index.js +++ b/packages/lavas-cli/src/lib/utils/index.js @@ -52,8 +52,8 @@ exports.isNetworkConnect = function () { /** * 获取 Lavas 项目的根目录 * - * @params {Object} options 选项 - * @params {boolean} options.containsFound 结果包含是否是Lavas项目 + * @param {Object} options 选项 + * @param {boolean} options.containsFound 结果包含是否是Lavas项目 * * @return {string|Object} 项目根目录,当options.containsFound 为 true时,一并返回是否是Lavas项目 */ @@ -99,7 +99,7 @@ exports.getLavasProjectRoot = function (options = {}) { }; exports.getLavasCoreVersion = function () { - let lavasProject = exports.getLavasProjectRoot({containsFound: true}) + let lavasProject = exports.getLavasProjectRoot({containsFound: true}); if (!lavasProject.found) { return; @@ -112,4 +112,4 @@ exports.getLavasCoreVersion = function () { let version = fs.readJsonSync(packageJsonPath).version; return version; -} +}; diff --git a/packages/lavas-core-vue/package.json b/packages/lavas-core-vue/package.json index c885278..f1f1928 100644 --- a/packages/lavas-core-vue/package.json +++ b/packages/lavas-core-vue/package.json @@ -82,9 +82,9 @@ "vuex": "^2.3.1", "webpack": "^3.6.0", "webpack-bundle-analyzer": "^2.8.2", - "webpack-chain": "^4.5.0", + "webpack-chain": "4.8.0", "webpack-dev-middleware": "^1.12.0", - "webpack-hot-middleware": "^2.19.0", + "webpack-hot-middleware": "~2.22.0", "webpack-node-externals": "^1.6.0", "workbox-webpack-plugin": "^3.4.1" },