8

我目前的情况是我使用 grunt 制作我的 express 应用程序的生产版本(最小化并合并所有 js/css,复制所有文件)然后我必须运行一个设置环境变量的脚本(我的应用程序仅在以 TEST 模式运行时提供测试工具),创建一个空的 Mongo 测试数据库,然后在应用程序目录上调用 npm start,然后我必须手动从 Chrome 或 Phantom 运行测试,我想要做的是grunt 设置环境变量并运行服务器,运行测试,然后停止服务器(将来如果一切成功,也可以部署它)。但是,当我尝试在 grunt 中运行应用程序时,它会在完成后立即停止。

我如何 grunt 启动应用程序,等到它启动然后运行测试?

4

2 回答 2

11

如果您检查grunt-express,它是通过 grunt 快速执行 Web 服务器任务的插件。

快速保活

请注意,该服务器仅在 grunt 运行时运行。一旦 grunt 的任务完成,Web 服务器就会停止。可以通过在任务列表的末尾附加一个 express-keepalive 任​​务来更改此行为,如下所示

grunt.registerTask('myServer', ['express', 'express-keepalive']);
现在,当您运行 grunt myServer 时,您的 express 服务器将保持活动状态,直到您手动终止它。

也可以通过运行类似grunt express express-keepalive.

这种设计使您可以灵活地将 grunt-express 与另一个随后立即运行的任务结合使用,例如 grunt-contrib-qunit 插件 qunit 任务。如果我们强制 express 任务总是异步的,这样的用例就不会再发生了。

指南grunt-contrib-qunit包中的用于在无头 PhantomJS 实例中运行 QUnit 单元测试。还要注意最后一行,如果您强制 express 始终异步,那将毫无用处。

的npm链接grunt-express

于 2013-04-09T19:21:54.213 回答
1

我不确定我是否正确理解了您的问题,但这可能会有所帮助:

你知道 Grunt 的异步功能吗?一段时间以来,我使用以下方法来启动(和停止)我的 Express 应用程序。我用它和手表一起使用,所以它在保存时自动重新启动。在这种情况下,您必须将手表的 nospawn 选项设置为 true。

var server = null;
grunt.registerTask('server', 'Start server', function() {
  var done = this.async();
  if (server !== null) {
    server.close();
    clearCache();
  }
  var app = require('./my-express-app.js');
  server = http.createServer(app).listen(app.get('port'), function(){
    done();
  });
});

function clearCache() {
  for (key in require.cache) {
    if (key.indexOf(__dirname + '/node_modules/') == -1) {
      delete require.cache[key];
    }
  }
}

由于这个require-cache-hack,它很丑陋。但是,它有效。

于 2013-04-10T20:23:46.213 回答