我见过这个问题:在 webpack 构建后运行命令,我修改了那里提供的示例代码。
为了描述我的场景,我试图获取 webpack 输出的资产并将它们部署到已安装的网络驱动器上。我ncp
用来复制目录并且实际复制工作正常,似乎当 webpack 调用after-emit
事件或done
事件时,它实际上并没有完成将文件发送或写入文件系统。我的副本最终会复制空文件或部分写入的文件。
这是整个插件:
'use strict';
var ncp = require('ncp').ncp;
function WebPackDeployAfterBuild(options) {
var defaultOptions = {
};
this.options = Object.assign(defaultOptions, options);
}
WebPackDeployAfterBuild.prototype.apply = function(compiler) {
const options = this.options;
compiler.plugin("done", (stats) => {
console.log(Object.keys(stats.compilation.assets));
console.log("\nExecuting Deploy on done...");
ncp(options.from, options.to, function(err) {
if (err) {
console.error("Err in ncp");
}
console.log(`Finished deploying ${options.from} to ${options.to}`);
});
});
compiler.plugin("after-emit", (compilation, callback) => {
console.log(Object.keys(compilation.assets));
console.log("\nExecuting Deploy on after-emit...");
ncp(options.from, options.to, function(err) {
if (err) {
console.error("Err in ncp");
}
console.log(`Finished deploying ${options.from} to ${options.to}`);
callback();
});
});
};
module.exports = WebPackDeployAfterBuild;
这是我webpack.config.js
文件中的用法:
config.plugins.push(
new WebPackDeployAfterBuild({
from: path.resolve(__dirname, './myOutputPath'),
to: 'Q:/'
})
)
我已经包含了 thedone
和after-emit
handlers,但实际上我一直在注释掉一个。我只需要运行一次事件,但这两个事件都触发得太快了。我可以使用其他活动吗?
E:忘了提,我也在一个 webpack --watch 任务上运行这个。我想保存一个文件,让 webpack 处理它并在我开发时立即将它部署到我的服务器上。如果有更好的开发工作流程,我愿意接受建议。
E2:这是发生的事情的日志:
2ms optimize chunk assets
7ms optimize assets
95% emit
[ 'scripts/app.bundle.js', 'scripts/vendor.bundle.js' ]
Executing Deploy After build...
11ms emit
Hash: a005eef9ae47a167f791
Version: webpack 1.13.2
Time: 278ms
Asset Size Chunks Chunk Names
scripts/app.bundle.js 61.1 kB 0 [emitted] scripts/app
+ 20 hidden modules
Child html-webpack-plugin for "index.html":
+ 3 hidden modules
Finished deploying C:\Users\redacted\Source\myprojectOutput to Q:/
您可以看到我所做的日志记录发生在11ms emit
消息之前,我希望它在那之后......