我目前的情况是我使用grunt制作我的快递应用程序的生产版本(最小化并合并所有js / css,复制所有文件到位)然后我必须运行一个设置环境变量的脚本(我的应用程序仅在TEST模式下运行时提供测试工具),创建一个空的Mongo测试数据库,然后在应用程序目录中调用npm start,然后我手动从Chrome或Phantom运行测试,我想要的do是让grunt设置环境变量并运行服务器,运行测试,然后停止服务器(将来如果一切都成功,那么部署它也会很好)。但是,当我尝试在grunt中运行应用程序时,它会在完成后立即停止。
如何让grunt启动应用程序,等到它启动然后再运行测试?
答案 0 :(得分:11)
如果您通过grunt检查grunt-express哪个是快速网络服务器任务的插件。
表达-存活
请注意,只要grunt正在运行,此服务器就会运行。一旦 grunt的任务已经完成,Web服务器停止了。这种行为可以 通过在你的结尾添加一个快速保持任务来改变 像这样的任务清单
grunt.registerTask('myServer', ['express', 'express-keepalive']);
现在,当您运行grunt myServer时,您的快速服务器将保持活动状态 直到你手动终止它。此功能也可以通过运行
grunt express express-keepalive
等任务来临时启用。此设计使您可以灵活地使用grunt-express 与之后立即运行的另一项任务相结合,例如 grunt-contrib-qunit插件qunit任务。如果我们强制表达任务 总是异步,这种用例不再发生。
指南grunt-contrib-qunit
包用于在无头PhantomJS实例中运行QUnit单元测试。还要记住最后一行,如果你强制表达总是异步,那就没用了。
grunt-express
,npm link。
答案 1 :(得分:1)
我不确定我是否正确理解你的问题,但这可能会有所帮助:
你知道Grunt的异步功能吗?有一段时间我使用以下方法启动(并停止)我的Express应用程序。我用手表,所以它会在保存时自动重启。在这种情况下,您必须将watch的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];
}
}
}
因为这个需要缓存黑客而丑陋。但是,它有效。