heroku上的咕噜声和凉亭

Posted

技术标签:

【中文标题】heroku上的咕噜声和凉亭【英文标题】:grunt and bower on heroku 【发布时间】:2013-12-18 04:03:11 【问题描述】:

今天我想将我的node.js 应用程序部署到heroku。在本地,我也在使用 bowergrunt 进行开发,我还想继续使用它们。

现在,根据我在网上找到的一些建议,我将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

heroku 上的应用程序错误无法更新 heroku 配置

如何让我在 Heroku 上的 Laravel 项目使用 Heroku Postgres?

加快 Heroku 上的部署 [重复]