在部署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
。 尝试一下,并设置你的dependencies
和devDependencies
像你最初一样(只是为了看看它是否工作)。
我在这里比赛迟到了,但我已经使用了一些方法,并认为我会分享。
选项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和它的斋戒。