在将Grunt应用程序部署到heroku时,NPM不会安装模块依赖项

时间:2013-12-19 12:41:43

标签: json node.js heroku gruntjs

我使用grunt创建了一个静态单页网站。我现在正尝试使用节点grunt的heroku-buildpack-nodejs-grunt将其部署到heroku。

下面是我的根目录的图片:

project root directory image

这是我的Gruntfile package.json

Procfile

web: node index.html

当我运行$ git push heroku master时,它会转到Gruntfile并失败:

-----> Found Gruntfile, running grunt heroku:production task
>> Local Npm module "grunt-contrib-uglify" not found. Is it installed?

以上错误继续列出未找到的所有本地NPM模块。如果我列出所有loadNpmTasks而不是使用“load-grunt-tasks”,我会得到完全相同的错误。

当我$ heroku logs时,我得到了:

Starting process with command `node web.js`
Error: Cannot find module '/app/web.js'

谁能看到我出错的地方?

4 个答案:

答案 0 :(得分:3)

对于路过这里的人来说,我无法解决问题。这就是我要去的地方:

在我的Gruntfile中,我将npm模块从devDependencies移动到依赖项。然后Heroku能够安装这些依赖项。

但是,当Heroku运行任务时,它会在haml任务中停止错误“你需要安装Ruby和Haml并在你的PATH中完成这项任务”。添加红宝石和haml到Gruntfile,因为引擎不起作用。

答案 1 :(得分:2)

我唯一能想到的是,也许Heroku首先安装你的devDependencies,尝试运行Grunt,但由于它还没有安装load-grunt-tasks,你没有得到{{} 1}}行(grunt.loadNpmTasks( 'grunt-contrib-uglify' );为你做的),因此Grunt找不到包。

您可以尝试更改load-grunt-tasks以使用Gruntfile方法明确列出所有npm模块吗?

修改

记得我必须要做的另一件事:

grunt.loadNpmTasks()

(显然用您的Heroku应用名称替换heroku labs:enable user-env-compile -a myapp heroku config:set NODE_ENV=production 。)

这使得Heroku允许用户设置环境变量,然后将服务器设置为myapp。试试这个,并设置你原来的productiondependencies(只是为了看看它是否有效)。

答案 2 :(得分:2)

我来这里比赛的时间已经很晚了,但我已经使用了几种方法,并且认为我会分享。

选项1:获取Heroku构建

这不是我最喜欢的方法,因为它可能需要很长时间,但无论如何它都在这里。

Heroku在收到您推送的更改时会运行npm install --production。这只会安装生产依赖项。

您不必更改环境变量来安装dev依赖项。 npm install--dev switch允许您这样做。

npm install --dev

Heroku提供了一篇关于如何customize your build的文章。实际上,您可以在package.json中将上述命令作为postinstall脚本运行。

"scripts": {
  "start": "node index.js",
  "postinstall": "npm install --dev && grunt build"
}

我认为这比在我的生产部分中放置dev依赖项或来回更改环境变量以使我的依赖项构建更清晰。

另外,我没有使用Procfile。 Heroku可以通过调用npm start运行您的应用程序(至少它可以在OP之后差不多两年)。因此,只要您提供该脚本(如上所示),Heroku应该能够启动您的应用程序。

至于你的ruby依赖项,我还没有尝试在Heroku上的节点应用程序中安装ruby gem,但this SO answer建议您使用multi buildpack

选项2:部署您的依赖关系

有些人认为让Heroku构建你的应用程序是不好的形式。他们建议您应该推高所有依赖项。如果您像我一样并且讨厌检查node_modules目录,那么您可以创建一个新分支,强制添加node_modules目录,然后部署该分支。在git中,这看起来像:

git checkout -b deploy
git add -f node_modules/
git commit -m "heroku deploy"
git push heroku --force deploy:master
git checkout master
git branch -D deploy

你显然可以将它变成一个脚本,这样你就不必每次都输入它。

选项3:自己动手

这是我最喜欢的部署方式。 Heroku增加了对slug deploys的支持。上一个链接是一个很好的阅读,我强烈推荐它。我在Travis-CI的自动构建中执行此操作。我有一些自定义脚本来tar我的应用程序并将slu push推送到Heroku及其快速。

答案 3 :(得分:0)

我遇到了类似的问题,Heroku 没有安装我所有的依赖项,而我在本地没有问题。我通过运行修复它

function ImportJSON(url, query, parseOptions) {
  return ImportJSONAdvanced(url, null, query, parseOptions, includeXPath_, defaultTransform_);
}

function ImportJSONAdvanced(url, fetchOptions, query, parseOptions, includeFunc, transformFunc) {
  var jsondata = UrlFetchApp.fetch(url, fetchOptions);
  var object   = JSON.parse(jsondata.getContentText());
  
  return parseJSONObject_(object, query, parseOptions, includeFunc, transformFunc);
}

进入我部署项目的路径。这会指示 Heroku 使用 npm install 而不是 npm ci 来安装您的依赖项,这是默认的!来自 Heroku 开发中心:

"Heroku 使用锁文件,无论是 package-lock.json 还是 yarn.lock,来安装预期的依赖树,所以一定要检查这些文件到 git 中以确保跨环境的依赖版本相同。如果你正在使用npm,Heroku 将使用 npm ci 来设置构建环境。"