Javascript 如何在量角器运行前启动服务器并在运行后进行清理

Javascript 如何在量角器运行前启动服务器并在运行后进行清理,javascript,protractor,webpack-dev-server,Javascript,Protractor,Webpack Dev Server,在运行服务器之前,Digrator似乎没有提供任何开箱即用的解决方案。在功能测试运行之前必须运行多个命令是一种糟糕的用户体验,对自动化测试也不好 Angular cli有自己的解决方案,相当复杂,这个插件声称重复了这个解决方案,尽管它不适合我,并且可能没有维护 编辑:下面接受更好的解决方案 我提出了一个使用child_process.exec的解决方案,它似乎工作得很好,尽管我不太喜欢它。我想与大家分享一下,以防有人需要,看看是否有人能想出更好的解决方案 在量角器的beforeLaunch挂钩中

在运行服务器之前,Digrator似乎没有提供任何开箱即用的解决方案。在功能测试运行之前必须运行多个命令是一种糟糕的用户体验,对自动化测试也不好

Angular cli有自己的解决方案,相当复杂,这个插件声称重复了这个解决方案,尽管它不适合我,并且可能没有维护

编辑:下面接受更好的解决方案

我提出了一个使用child_process.exec的解决方案,它似乎工作得很好,尽管我不太喜欢它。我想与大家分享一下,以防有人需要,看看是否有人能想出更好的解决方案

在量角器的beforeLaunch挂钩中启动流程:

beforeLaunch: () => {
    webpackServerProcess = exec(`webpack-dev-server --port=3003 --open=false`, null, () => { 
      console.log(`Webpack Server process reports that it exited. Its possible a server was already running on port ${port}`)
    });
  },
然后,在配置块上方,我们设置退出处理程序,以确保完成后服务器被杀死

let webpackServerProcess; // Set below in beforeLaunch hook
function cleanUpServer(eventType) {
  console.log(`Server Cleanup caught ${eventType}, killing server`);
  if (webpackServerProcess) {
    webpackServerProcess.kill();
    console.log(`SERVER KILLED`);
  }
}

[`exit`, `SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`].forEach((eventType) => {
  process.on(eventType, cleanUpServer.bind(null, eventType));
})

处理cntrl+c事件和进程被ID终止的情况需要各种事件侦听器。奇怪的是,节点没有提供包含所有这些事件的事件。

量角器也有
onCleanUp
,将在文件中的所有规范完成后运行

而且,通过保留对流程的引用,您正在做正确的事情,以便以后可以终止它

let webpackServerProcess;
beforeLaunch: () {
    webpackServerProcess = exec('blah'); // you could use spawn instead of exec
},
onCleanUp: () {
    process.kill(webpackServerProcess.pid);
    // or webpackServerProcess.exit();
}

由于您是使用child_process.exec启动serverProcess,而不是处于分离状态,因此如果主进程被SIGINT或其他任何东西终止,它应该会消失。因此,您甚至不必杀死它或清理它。

我发现了一种更可靠的方法,可以使用webpack dev server node api来完成这项工作。这样就不会产生单独的进程,我们也不必清理任何东西。此外,它会阻止量角器,直到网页包准备就绪

  beforeLaunch: () => {
    return new Promise((resolve, reject) => {
      new WebpackDevServer(webpack(require('./webpack.config.js')()), {
        // Do stuff
      }).listen(APP_PORT, '0.0.0.0', function(err) {
        console.log('webpack dev server error is ', err)
        resolve()
      }).on('error', (error) => {
        console.log('dev server error ', error)
        reject(error)
      })
    })
  },

甜甜的,都是好的输入。我尝试了“oncleanup”,但在中断或其他情况下失败了很多时间,所以我不得不手动观看。否则它会粘在系统上并占用一个端口。我不知道为什么这个答案不起作用。你能把它扩大一点吗?未定义“WebpackDevServer”。你是从要求“网页包开发服务器”中得到的吗?您正在调用的“网页包”功能是什么?“do stuff”中应该包含什么?在API请求完成之前,是否可以使用它来不启动浏览器?