heroku上的咕噜声和凉亭
Posted
技术标签:
【中文标题】heroku上的咕噜声和凉亭【英文标题】:grunt and bower on heroku 【发布时间】:2013-12-18 04:03:11 【问题描述】:今天我想将我的node.js
应用程序部署到heroku。在本地,我也在使用 bower
和 grunt
进行开发,我还想继续使用它们。
现在,根据我在网上找到的一些建议,我将bower
添加到我的dependencies
并将"postinstall": "node_modules/.bin/bower install
添加到我的package.json
postinstall
。
现在我遇到了grunt
的一些问题。当我将 grunt 依赖项从 devDependencies
移动到 dependencies
时,grunt
无法识别我的 tasks
,例如当我有
"name": "js-linkedin-connector",
"version": "0.1.0",
"dependencies":
"passport": "~0.1.17",
"passport-local": "~0.1.6",
"passport-linkedin-oauth2": "~1.0.1",
"connect": "~2.11.0",
"underscore": "~1.5.2",
"bower": "1.2.x",
"grunt": "~0.4.1",
"grunt-cli": "0.1.11",
"load-grunt-tasks": "~0.1.0",
"grunt-contrib-copy": "~0.4.1",
"grunt-contrib-concat": "~0.3.0",
"grunt-contrib-coffee": "~0.7.0",
"grunt-contrib-uglify": "~0.2.0",
"grunt-contrib-compass": "~0.5.0",
"grunt-contrib-jshint": "~0.6.0",
"grunt-contrib-cssmin": "~0.6.0",
"grunt-contrib-connect": "~0.5.0",
"grunt-contrib-clean": "~0.5.0",
"grunt-contrib-htmlmin": "~0.1.3",
"grunt-contrib-watch": "~0.5.2",
"grunt-autoprefixer": "~0.2.0",
"grunt-usemin": "~2.0.0",
"grunt-svgmin": "~0.2.0",
"grunt-rev": "~0.1.0",
"grunt-concurrent": "~0.3.0",
"grunt-jasmine-node": "~0.1.0",
"grunt-google-cdn": "~0.2.0",
"grunt-ngmin": "~0.0.2",
"time-grunt": "~0.1.0",
"grunt-karma": "~0.6.2",
"connect-livereload": "~0.3.0"
,
"devDependencies":
"karma-ng-scenario": "~0.1.0",
"karma-script-launcher": "~0.1.0",
"karma-chrome-launcher": "~0.1.0",
"karma-firefox-launcher": "~0.1.0",
"karma-html2js-preprocessor": "~0.1.0",
"karma-jasmine": "~0.1.3",
"karma-requirejs": "~0.1.0",
"karma-phantomjs-launcher": "~0.1.0",
"karma": "~0.10.4",
"karma-ng-html2js-preprocessor": "~0.1.0"
,
"engines":
"node": ">=0.8.0",
"npm": "1.3.x"
,
"scripts":
"test": "grunt test",
"postinstall": "node_modules/.bin/bower install;node_modules/.bin/grunt server:dist"
在我的package.json
中,当我输入./node_modules/.bin/grunt
时,我得到:
Warning: Task "jshint" not found. Use --force to continue.
Aborted due to warnings.
但是当我将 grunt
依赖项移动到 devDependencies
时:
"name": "js-linkedin-connector",
"version": "0.1.0",
"dependencies":
"passport": "~0.1.17",
"passport-local": "~0.1.6",
"passport-linkedin-oauth2": "~1.0.1",
"connect": "~2.11.0",
"underscore": "~1.5.2",
"bower": "1.2.x"
,
"devDependencies":
"grunt": "~0.4.1",
"grunt-cli": "0.1.11",
"load-grunt-tasks": "~0.1.0",
"grunt-contrib-copy": "~0.4.1",
"grunt-contrib-concat": "~0.3.0",
"grunt-contrib-coffee": "~0.7.0",
"grunt-contrib-uglify": "~0.2.0",
"grunt-contrib-compass": "~0.5.0",
"grunt-contrib-jshint": "~0.6.0",
"grunt-contrib-cssmin": "~0.6.0",
"grunt-contrib-connect": "~0.5.0",
"grunt-contrib-clean": "~0.5.0",
"grunt-contrib-htmlmin": "~0.1.3",
"grunt-contrib-watch": "~0.5.2",
"grunt-autoprefixer": "~0.2.0",
"grunt-usemin": "~2.0.0",
"grunt-svgmin": "~0.2.0",
"grunt-rev": "~0.1.0",
"grunt-concurrent": "~0.3.0",
"grunt-jasmine-node": "~0.1.0",
"grunt-google-cdn": "~0.2.0",
"grunt-ngmin": "~0.0.2",
"time-grunt": "~0.1.0",
"grunt-karma": "~0.6.2",
"connect-livereload": "~0.3.0",
"karma-ng-scenario": "~0.1.0",
"karma-script-launcher": "~0.1.0",
"karma-chrome-launcher": "~0.1.0",
"karma-firefox-launcher": "~0.1.0",
"karma-html2js-preprocessor": "~0.1.0",
"karma-jasmine": "~0.1.3",
"karma-requirejs": "~0.1.0",
"karma-phantomjs-launcher": "~0.1.0",
"karma": "~0.10.4",
"karma-ng-html2js-preprocessor": "~0.1.0"
,
"engines":
"node": ">=0.8.0",
"npm": "1.3.x"
,
"scripts":
"test": "grunt test",
"postinstall": "node_modules/.bin/bower install;node_modules/.bin/grunt server:dist"
一切正常。
问题是什么?如何解决它以将我的 grunt
+ bower
应用程序部署到 heroku?
【问题讨论】:
【参考方案1】:实际上,我已经尝试了一些方法来确定哪些对我有效,哪些对我无效。我需要用 uglify 缩小我的脚本。
首先,我将 grunt 和 grunt-contrib-uglify 添加到我的 devDependencies(当我在我的机器上开发时),并尝试了 package.json 中的“postinstall”脚本:
"scripts":
"start": "node index.js",
"postinstall": "grunt uglify"
,
"devDependencies":
"grunt": "~0.4.4",
"grunt-contrib-uglify": "^0.4.0"
这显然不起作用,因为 heroku 没有安装 devDependencies。
在此之后,我设置了 buildpack,向我的 Gruntfile.js 添加了一个 heroku 任务,删除了 postinstall 脚本并尝试推送。
这也不成功,因为 buildpack 只安装了 grunt-cli 和 grunt,没有安装 grunt-contrib-uglify。
接下来,我将 grunt 和 grunt-contrib-uglify 从 devDependencies 移至依赖项。 (如果我移动 uglify,我为什么不移动 grunt)。这种方式很有效,但让我觉得:如果我必须向依赖项添加 grunt,为什么我需要 buildpack?
我已恢复为默认构建包
heroku config:unset BUILDPACK_URL
并添加了上面提到的安装后脚本。这不起作用,因为仍然缺少 grunt 命令。
最后,我还在依赖项中添加了 grunt-cli,它现在可以工作了,无需 buildpack!
结论:您不需要 buildpack - 并将您的 grunt 依赖项添加到“依赖项”。 或者,buildpack 应该修复这个问题:https://github.com/mbuchetics/heroku-buildpack-nodejs-grunt/issues/5
【讨论】:
【参考方案2】:将您的 Grunt 依赖项保存在它们所属的 devDependencies
中。使用custom buildpack 允许 Heroku 在其平台上执行您的 Grunt 流程。
Sample app that shows how to do exactly that
Buildpacks 让您以不同的方式启动应用程序,在这种情况下,您需要从配置设置中更改它:
heroku config:set BUILDPACK_URL=https://github.com/mbuchetics/heroku-buildpack-nodejs-grunt.git
那么只需将heroku
任务添加到您的 Grunt 配置即可。
【讨论】:
谢谢,我今天晚些时候再看看。 我听从了您的建议,使用了这个 buildpack,一切正常,应用程序部署正确:),谢谢。 @Nico 您能否详细说明将它们留在“它们所属的地方”的 devDependencies 中?似乎如果您在生产服务中需要它们,它们不再是开发依赖项。您引用的 buildpack 建议也将 grunt 放入依赖项中。 @Nico 谢谢。我今天在拖钓,这也解决了我的问题。 +1,无论您何时在明尼阿波利斯,我都会喝您的第一杯啤酒。 官方内部版本已更新。下一页上的说明对我有用:devcenter.heroku.com/articles/nodejs-support以上是关于heroku上的咕噜声和凉亭的主要内容,如果未能解决你的问题,请参考以下文章
Heroku 上的空白页 - mean.js Angular 应用程序
使用 grunt、bower、node 模块部署到 heroku
Node.js Heroku 部署 - 无法执行安装后脚本来安装 Bower