【问题标题】:How to exit webpack-dev-server execution after running test suite运行测试套件后如何退出 webpack-dev-server 执行
【发布时间】:2019-05-15 06:08:52
【问题描述】:

我创建了一个构建应用程序的 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 startnpm start

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


【解决方案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}`)
]

【讨论】:

    【解决方案2】:

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

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

    如果您使用npm run start,它会使用您的操作系统的shell 执行您的package.json 中定义的start 脚本。因此,即使您使用的是 Cygwin(或类似软件),它仍应使用 cmd.exe 运行它。

    解决方案
    使用npm run start 而不是npm start,当你 CTRL + C 时它应该终止进程

    【讨论】:

    • 我认为您没有理解,因此我编辑了问题以使其更清楚。相同的配置文件运行 devserver 并运行测试套件(作为插件)。我需要的是在插件执行后中止开发服务器。你知道怎么做吗?
    • CTRL + C 对我来说很容易,但我需要该过程自行完成,因此当我在部署例程中运行此命令时它会起作用
    • 知道了。是的,您的编辑更有意义。也感谢您分享您的答案!
    猜你喜欢
    • 2023-01-12
    • 2017-12-18
    • 2021-01-24
    • 2016-09-24
    • 2016-04-25
    • 2019-05-02
    • 2021-06-24
    • 2022-10-01
    • 1970-01-01
    相关资源
    最近更新 更多