builder-isv
Version:
ISV 模块本地预览与云构建器
66 lines (55 loc) • 2.33 kB
JavaScript
/**
* @author 龙喜<xiaolong.lxl@alibaba-inc.com>
* @description 安装依赖插件
*/
;
const path = require('path');
const Base = require('../models/base');
const utils = require('../lib/utils');
function InstallDepsPlugin(options) {
this.options = options;
}
InstallDepsPlugin.prototype.apply = function(compiler) {
// 预览模式
if (this.options.invokeType === Base.INVOKE_TYPE_PREVIEW) {
// watch 模式下每次重新构建前都会触发此事件
compiler.plugin('watch-run', (compilation, callback) => {
// 前置 hook,用于清空「依赖安装错误」标记
this.options.onBeforeInstall && this.options.onBeforeInstall();
let prevPackageInfo = utils.JSONStore.create(path.join(this.options.outputDir, 'package.json'), true);
let packageInfo = utils.JSONStore.create(path.join(this.options.cwd, 'package.json'));
//console.log(path.join(this.options.outputDir, 'package.json'), path.join(this.options.cwd, 'package.json'));
//console.log(JSON.stringify(prevPackageInfo.dependencies), JSON.stringify(packageInfo.dependencies));
// 对比 dependencies
if (JSON.stringify(prevPackageInfo.dependencies) !== JSON.stringify(packageInfo.dependencies)) {
prevPackageInfo.dependencies = packageInfo.dependencies;
prevPackageInfo.changed = true;
prevPackageInfo.__save();
utils.log.info('模块依赖发生了变更,重新安装依赖(修改依赖后,需编辑 JS 以触发重新编译)');
// 执行 tnpm 安装依赖
utils.tnpmInstall(this.options.cwd).then(() => {
callback();
}, (error) => {
// 传递 error 将导致 watch 停止,所以使构建正常进行,通过 onError 回调通知 renderer 透出错误即可
this.options.onError && this.options.onError(error);
callback();
});
} else {
prevPackageInfo.changed = false;
prevPackageInfo.__save();
callback();
}
});
} else {
// 云构建模式
compiler.plugin('run', (compilation, callback) => {
// 执行 tnpm 安装依赖
utils.tnpmInstall(this.options.cwd).then(() => {
callback();
}, (error) => {
callback(error);
});
});
}
};
module.exports = InstallDepsPlugin;