grunt server 无法连接 <gruntjs>

13
module.exports = function(grunt) {

  // Project configuration.
    grunt.initConfig({
      server: {
        port: 8888,
        base: '.'
      }
    });

};

C:\Program Files\nodejs\test\grunt>
C:\Program Files\nodejs\test\grunt>grunt server
Running "server" task
Starting static web server on port 8888.

完成,没有错误。

但是无法使用浏览器连接输入[http://127.0.0.1:8888][1]! 窘~

在Windows或Unix中如何解决此问题?


它被修复了吗,还是你知道为什么? - adardesign
我经历了相同的情况,并且很想知道是否有人知道这个问题。 - tbwiii
4个回答

26
在 grunt 0.4 中结合使用 grunt-contrib-connect,您可以通过使用 keepalive 参数来运行长时间运行的服务器:grunt connect:target:keepalive 或将其定义为配置选项:
grunt.initConfig({
  connect: {
        target:{
            options: {
                port: 9001,
                keepalive: true
            }
        }
    }
});

这似乎是最具建设性的答案。 - Tres
这对我来说真是救命稻草。 - Rahul Desai

5

不要使用grunt来提供项目服务。Grunt是一个构建工具。相反,使用npm生命周期脚本。

server.js

var express = require("express"),
    app = express();
app.use('/', express.static(__dirname));
app.listen(8888);

package.json

{
    "name": "my-project",
    "scripts": {
        "start": "node server.js"
    },
    "dependencies": {
        "express": "3"
    }
}

现在你可以运行npm start,一切都会很好。Grunt是一个构建工具,而不是服务器。npm是一个包生命周期管理器,而不是构建工具。Express是一个服务器库。请在适当的地方使用每个工具。
后续(2013-08-15):
唯一的例外是当您需要将项目提供给构建堆栈中的其他测试工具时。 grunt-contrib-connect插件专门为此用例而设计,并具有keepalive配置设置,该设置将在提供静态文件时保持grunt处于打开状态。通常与watch任务一起使用,该任务在测试或代码更改时运行测试套件。

2
我知道这是老问题,但如果你使用 express.static('.'),子目录(例如 css、js 等)将会得到 403 错误。请改用 express.static(__dirname)。 - Nick Mitchinson
最佳实践的绝对正确。编辑答案以使用__dirname。 - David Souther
David,我完全同意它不应该成为生产工具。然而,我认为说“永远不要运行任意任务”是误导性的,因为这正是它的设计初衷。例如,我可能想运行我的Connect任务,以服务我的Mocha测试,这样我就不必复制任何功能来在浏览器中运行它们,而不是像开发功能一样通过Grunt运行它们。我不反对你,只是我不认为它像你所声称的那样黑白分明。 - Tres
1
从教育角度来看,在这个问题的背景下,我觉得呈现一个黑白分明的答案更有用。也许最初的问题确实是关于测试的——作为运行Grunt服务器的最常见和非常有用的原因——但我没有从问题中得出这一点,并且发现将选项减少到问者更加熟悉这些工具为止更为合适。 - David Souther
1
对于使用教学法的使用加1分:),澄清和谨慎行事是明智之举。 - Tres
显示剩余2条评论

4

server任务只在需要时运行,但您可以防止其退出。从另一个问题的评论中的widget:在您的grunt.js文件中定义一个名为run的任务,该任务运行serverwatch任务。

grunt.registerTask("run", "server watch");

watch 任务会一直运行,因此它会阻止 server 任务结束。只需确保您还有一个针对 watch 任务的配置即可。以下是在您的 grunt.js 文件中将其全部放在一起的方式:

module.exports = function (grunt) {
  // …
  grunt.initConfig({
    // …
    watch: {
      files: "<config:lint.files>",
      tasks: "lint qunit",
    },
    // …
  });

  grunt.registerTask("run", "server watch");
};

从命令行中只需输入:

$ grunt run

服务器将保持运行状态。
另外,正如@NateBarr指出的那样,你可以从命令行中运行:
$ grunt server watch

1
或者只需执行 $ grunt server watch - Nate Barr

0

Grunt 默认情况下仅启动服务器进行测试(或任何其他所需任务...),并在完成后立即退出....

但幸运的是,我找到了一个解决方案,通过将以下内容添加到您的 grunt.js 文件中,可以让您选择性地阻止服务器退出。

grunt.registerTask('wait', 'Wait for a set amount of time.', function(delay) {
   var d = delay ? delay + ' second' + (delay === '1' ? '' : 's') : 'forever';
   grunt.log.write('Waiting ' + d + '...');
   // Make this task asynchronous. Grunt will not continue processing
   // subsequent tasks until done() is called.
   var done = this.async();
  // If a delay was specified, call done() after that many seconds.
   if (delay) { setTimeout(done, delay * 1000); }
});

然后在你的命令行中调用它:grunt server wait,然后你应该能够在浏览器中看到它。

确保将其添加到module.exports = function(grunt){...}内部。


谁给这个点了踩?“Grunt启动服务器进行测试(或任何其他要求的任务),并在完成后立即退出......” 这是一个很棒的信息。 - allenhwkim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接