4

我正在尝试将reveal.js 应用程序部署到Heroku。Reveal.js 通过grunt connect命令在节点上运行。该应用程序还需要 ruby​​ 来即时编译资产。在本地,我可以使用grunt serve.

最初,由于 compass 是 的依赖项grunt watch,Heroku 只检测到 Gemfile 并假设我正在运行一个 ruby​​ 应用程序。我使用 nodejs 自定义 buildpack 来强制 Heroku 将其视为 nodejs 应用程序。

Procfile 包含

web: grunt serve

日志显示

 2013-06-17T13:51:56.187012+00:00 heroku[router]: at=error code=H14 desc="No web processes running"

heroku ps也没有显示任何内容。我可以成功运行“heroku run grunt serve”,并且我已将reveal附带的默认Gruntfile.js修改为接受process.env,即

connect: {
  server: {
    options: {
      port: process.env.PORT || 8000,
      base: '.'
    } 
  }
}

作为最后一次尝试,我尝试使用 Heroku-nodejs-grunt 构建包( https://github.com/mbuchetics/heroku-buildpack-nodejs-grunt ),它将在部署时运行 grunt 任务来编译资产。仍然没有运气,heroku logs --tail仍然显示没有进程运行。探索heroku run显示 grunt 可用,并且grunt serve命令成功执行。

当开始使用新的 grunt 构建包时,上面的 Gruntfile.js 出现错误,说“进程”未定义。我将端口切换为0。

Web 服务器将响应的端口。如果指定的端口已被使用,任务将失败。您可以使用特殊值 0 或 '?' 使用系统分配的端口。

没用,试过“?”,没用(仍然没有网络进程和heroku restart什么也没做)

我不知道如何让 Heroku 使用 grunt 作为我的主要 Web 服务器进程!

4

3 回答 3

6

我能够使用 nodejs 和 expressJs 使其工作。

通过遵循heroku“nodejs入门”,我能够使用expressjs获得一个工作的webapp,并在web.js中声明它:

var express = require("express");
var app = express();
app.use(express.logger());
app.use("/", express.static(__dirname));

var port = process.env.PORT || 5000;
app.listen(port, function() {
  console.log("Listening on " + port);
});

有了这个,你就可以从 / 静态地服务一切。

您在这里有来源:https ://github.com/MichaelBitard/revealjs_heroku和一个工作示例:http: //murmuring-cove-4212.herokuapp.com/

于 2013-09-28T11:14:46.710 回答
0

您的问题是默认grunt serve绑定到localhost. 要使其正常工作,您需要对以下内容进行一些小的更改reveal.js

首先添加grunt-clidevDependency

diff --git a/package.json b/package.json
index 10489bb..4c58442 100644
--- a/package.json
+++ b/package.json
@@ -36,6 +36,7 @@
     "grunt-contrib-connect": "~0.8.0",
     "grunt-autoprefixer": "~1.0.1",
     "grunt-zip": "~0.7.0",
+    "grunt-cli": "~0.1.13",
     "grunt": "~0.4.0",
     "node-sass": "~0.9.3"
   },

然后向其中添加一个hostname参数,grunt该参数将用于绑定到0.0.0.0而不是localhost.

diff --git a/Gruntfile.js b/Gruntfile.js
index 3e67b9f..b2bfc47 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,5 +1,6 @@
 /* global module:false */
 module.exports = function(grunt) {
+   var hostname = grunt.option('hostname') || 'localhost';
    var port = grunt.option('port') || 8000;
    // Project configuration
    grunt.initConfig({
@@ -94,6 +95,7 @@ module.exports = function(grunt) {
        connect: {
            server: {
                options: {
+                   hostname: hostname,
                    port: port,
                    base: '.',
                    livereload: true,

现在你可以创建一个Procfile包含以下内容的部署到 Heroku:

web: npm install && node_modules/.bin/grunt serve --hostname 0.0.0.0 --port $PORT

已经reveal.js.

于 2015-02-12T13:15:33.243 回答
0

Currently with express v~4.13.3 express.logger() is deprecated and is not included with the express package. To solve this I had to import the dependency morgan.

My web.js file ended up being the following:

var express = require('express');
var morgan = require('morgan');
var app = express();
var port = process.env.PORT || 5000;

app.use(morgan('combined'));
app.use('/', express.static(__dirname));
app.listen(port, function() {
  console.log('Server started on ' + port);
});

As well, I needed to update my package.json to include the morgan lib. My dependencies in the file works with:

...
"dependencies": {
    "express": "~4.13.3",
    "morgan": "~1.7.0",
    "grunt-cli": "~0.1.13",
    "mustache": "~2.2.1",
    "socket.io": "~1.3.7"
},
...
于 2016-06-08T21:54:07.400 回答