我创建了一个 webpack 配置文件来构建应用程序,使用 webpack-dev-server 运行开发服务器并运行测试套件,如下所示。
devServer: {
contentBase: path.join(__dirname, "dist"),
port: 3000,
watchOptions: {
open: false
},
historyApiFallback: {
index: "/"
}
},
plugins: [
new WebpackShellPlugin({
onBuildEnd: [`./node_modules/.bin/cucumber-js ${testScope}`]
})
]
启动整个事情的命令如下
webpack-dev-server --config webpack.test.js
一切都很好,但是...现在怎么办?它永远不会停止!当测试套件正常时,我需要某种方式以成功状态退出。否则,它会导致无限部署(我使用 bitbucket 管道来部署应用程序)。
有人知道在运行特定插件后退出devServer执行的方法吗?
很可能是npm run start
和npm start
之间的区别
当您使用npm start
时,它会运行node server.js
不会与您的控制台内联运行。
如果使用npm run start
,它会使用操作系统的 shell 执行 package.json 中定义的start
脚本。因此,即使您使用的是Cygwin(或类似产品),它仍然应该使用cmd.exe运行它。
解决方案
使用npm run start
而不是npm start
当您 CTRL + C 时,它应该会杀死进程
我通过创建一个 webpack 插件并将其添加到我的配置文件中解决了我自己的问题。插件代码如下。它运行我传递给它的命令并退出进程,如果命令成功,则触发错误,如果一切正常,则成功。
const spawn = require("child_process").spawn;
module.exports = class RunScriptAndExit {
constructor(command) {
this.command = command;
}
apply(compiler) {
compiler.plugin("after-emit", (compilation, callback) => {
const { command, args } = this.serializeScript(this.command);
const proc = spawn(command, args, { stdio: "inherit" });
proc.on("close", this.exit);
callback();
});
}
serializeScript(script) {
if (typeof script === "string") {
const [command, ...args] = script.split(" ");
return { command, args };
}
const { command, args } = script;
return { command, args };
}
exit(error, stdout, stderr) {
if (error) {
process.exit(1);
} else {
process.exit(0);
}
}
};
我将其添加到我的插件列表中,如下所示:
plugins: [
new RunScriptAndExit(`./node_modules/.bin/cucumber-js ${testScope}`)
]