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

我使用grunt制作了一个静态单页面网站。 我现在正在尝试使用heroku buildpack将其部署到heroku,以用于节点咕噜声。

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

项目根目录映像

这是我的Gruntfile,package.json和Procfile:

https://gist.github.com/callumflack/8038464
https://gist.github.com/callumflack/8038483
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模块为未find。 如果我列出所有的loadNpmTasks而不是使用“load-grunt-tasks”,我会得到完全相同的错误。

当我$ heroku logs我得到:

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

任何人都可以看到我哪里出了错?

对于经过这里的任何人,我都无法解决这个问题。 这是我的地方:

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

然而,当Heroku运行任务时,它会停在哈姆任务w /错误“你需要安装Ruby和Haml,并在你的PATH中执行这个任务”。 作为引擎添加ruby&haml到Gruntfile不起作用。

我唯一能想到的就是Heroku可能首先安装你的devDependencies ,试着运行Grunt,但是由于它没有安装load-grunt-tasks ,所以你不会得到grunt.loadNpmTasks( 'grunt-contrib-uglify' ); 行(哪个load-grunt-tasks会为你做),因此Grunt找不到这个包。

你可以尝试改变你的Gruntfile使用grunt.loadNpmTasks()方法明确列出所有npm模块吗?

编辑:

只记得我不得不做的另一件事情:

 heroku labs:enable user-env-compile -a myapp heroku config:set NODE_ENV=production 

(显然用你的Heroku应用程序名称replacemyapp 。)

这使得Heroku允许用户设置环境variables,然后将服务器设置为production 。 尝试一下,并设置你的dependenciesdevDependencies像你最初一样(只是为了看看它是否工作)。

我在这里比赛迟到了,但我已经使用了一些方法,并认为我会分享。

选项1:让Herokubuild立

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

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

你不必改变你的环境variables来安装你的开发依赖项。 npm install有一个--dev开关来允许你这样做。

 npm install --dev 

Heroku提供了一篇关于如何自定义构build的文章。 本质上,你可以在package.json中运行上面的命令作为postinstall脚本。

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

我认为这比把开发依赖关系放在我的生产部分或者来回更改环境variables来获得我的依赖关系更加清洁。

另外,我不使用Procfile。 Heroku可以通过调用npm start来运行你的应用程序(至less现在可以在OP后的将近两年)。 所以只要你提供该脚本(如上所示)Heroku应该能够启动你的应用程序。

至于你的ruby的依赖,我没有试图安装一个ruby在Heroku的节点应用程序,但这个答案表明你使用多buildpack 。

选项2:部署您的依赖项

有人认为有Herokubuild立你的应用程序是不好的forms。 他们build议你应该推高你所有的依赖。 如果你像我一样,并讨厌检查你的node_modules目录,那么你可以创build一个新的分支,你强制添加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 

你显然可以把它写成一个脚本,这样你就不必每次input。

选项3:自己动手

这是我最喜欢的部署方式。 Heroku增加了对slu dep部署的支持。 以前的链接是一个很好的阅读,我强烈推荐它。 我在Travis-CI的自动构build中做这个。 我有一些自定义脚本来tar我的应用程序,并推动slu to Heroku和它的斋戒。