我司H5项目是由前端开发后本身部署在云端的, 以前每次开发 测试 完成 打包后都是本身手动上传代码;本着重复性的工做均可以交给机器去作的原则,决定写一个脚本命令能够实现自动上传;html
一. 开始着手;前端
我司用的是阿里云;就从文档开始入手吧;https://help.aliyun.com/document_detail/32070.html?spm=a2c4g.11186623.6.786.P96P8G; 参考文档后了解到在项目中能够使用node执行上传;
复制代码
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"devbuild": "cross-env NODE_CONFIG=dev node build/build.js && cross-env NODE_CONFIG=dev node file",
"build": "cross-env NODE_CONFIG=pro node build/build.js && cross-env NODE_CONFIG=pro node file"
},
"devDependencies": {
"ali-oss": "^6.0.0",
}
复制代码
const fs = require('fs');
const co = require('co'); // 异步流程控制co 模块;
const path = require('path');
const filePathRoot = path.resolve(__dirname, './dist');
const OSS = require('ali-oss');
const files = [];
const uploadFlagList = [];
let bucket = ''; // oss的bucket空间名
let remotePath = ''; // 远程oss文件名(根据本身须要配置)
const NODE_CONFIG = process.env.NODE_CONFIG;
if (NODE_CONFIG == 'dev') {
bucket = 'xxx';
remotePath = 'xxx';
} else if (NODE_CONFIG == 'pro') {
bucket = 'xxx';
remotePath = 'xxx';
}
// 构建oss对象,这里能够找大家的后台或者运维人员开通上传oss的帐号权限;
const client = new OSS({
region: 'xxx',
accessKeyId: 'xxx',
accessKeySecret: 'xxx',
bucket
});
(() => {
// 递归取出 打包后./dist 文件夹下全部文件的路径
function readDirSync(filePath) {
const filePaths = fs.readdirSync(filePath);
filePaths.forEach((item) => {
const cur_path = `${filePath}/${item}`;
const info = fs.statSync(cur_path);
if (info.isDirectory()) {
readDirSync(cur_path);
} else {
files.push(cur_path);
}
});
}
readDirSync(filePathRoot);
co(function* () {
try {
for (let index = 0; index < files.length; index += 1) {
const fileObj = files[index];
// 提交文件到oss,这里要注意,阿里云不须要建立新文件夹,只要有路径,没有文件夹会自动建立
const result = yield client.put(fileObj.replace(filePathRoot, remotePath), fileObj);
uploadFlagList.push(result);
if(!result) break;
}
const uplaodFlag = uploadFlagList.find(item => item.res.statusCode != 200);
if (uplaodFlag) {
console.log('上传失败');
} else {
console.log('上传成功');
}
} catch (e) {
console.log('上传失败,请查看日志: ', e);
}
});
})();
复制代码
二. 愉快的打包测试吧.vue
"devbuild": "cross-env NODE_CONFIG=dev node build/build.js && cross-env NODE_CONFIG=dev node file"
复制代码
执行打包命令 npm run devbuild(开发测试包,下一次介绍下配置的不一样环境的输出包和多页应用输出配置); 项目打包后 即开始执行NODE_CONFIG=dev node file.js文件;node
该js 递归遍历取出 打包后./dist 文件夹下全部文件的路径并上传到你指定好的oss空间内, 若是有一个上传失败的控制台会输出log('上传失败!')提醒你;webpack
通常遇到的问题是么有空间名,或者空间名不对;
上传失败,请查看日志: Error: Please create a bucket first
at Client.proto._objectRequestParams (C:\xxxxx\node_modules\ali-oss\lib\object.js:530:11)
at Client.putStream (C:\xxxxxxxxx\node_modules\ali-oss\lib\object.js:122:23)
at Client.put (C:\xxxxxx\node_modules\ali-oss\lib\object.js:69:23)
at <anonymous>
复制代码