运行测试套件后如何退出webpack-dev-server执行

时间:2018-12-14 00:01:47

标签: javascript webpack frontend web-deployment webpack-dev-server

我已经创建了一个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执行的方法吗?

2 个答案:

答案 0 :(得分:1)

可能是npm run startnpm start之间的区别

使用npm start时,它会运行node server.js,但不会与控制台内联运行。

如果使用npm run start,它将使用操作系统的外壳程序执行package.json中定义的start脚本。因此,即使您使用的是Cygwin(或类似产品),它仍应使用cmd.exe运行它。

解决方案
使用npm run start代替npm start,当您按下CTRL + C

时,它将终止进程

答案 1 :(得分:1)

我通过创建一个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}`)
]