2013-12-02 3 views
9

Сегодня я хотел развернуть свое приложение node.js на герою. Локально я использую bower и grunt для разработки, и я все еще хотел их использовать.grunt and bower on heroku

Теперь, следуя несколько советов, я нашел в Интернете, я добавил к моим bowerdependencies и добавил "postinstall": "node_modules/.bin/bower install к моим package.jsonpostinstall.

Теперь у меня возникли проблемы с grunt. Когда я пошевелить зависимости хрюкать в dependencies от devDependenciesgrunt не распознает 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 + для героя?

ответ

15

Сохраните ваши зависимости от 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.

+0

Спасибо, я посмотрю позже сегодня. – Andna

+3

Я следил за вашими советами по использованию этого сборщика, и все работает отлично, приложение развернуто правильно :), спасибо. – Andna

+2

@ Нико вы можете уточнить, что оставить их в devDependencies «где они принадлежат»? Похоже, что если вы нуждаетесь в них на своем производственном сервисе, они больше не зависят от разработчиков. Построчный пакет, на который вы ссылаетесь, рекомендует также вставлять хрюканье в зависимости. –

5

На самом деле, я пробовал некоторые методы, чтобы убедиться, что работает и что не для меня. Мне нужно было минимизировать мои скрипты с помощью uglify.

  1. Во-первых, я добавил ворчание и хрюканье-вно-уродовать моим devDependencies (как я разрабатываю на моей машине), и попробовал «постустановочных» сценарий в package.json:

    "scripts": { 
        "start": "node index.js", 
        "postinstall": "grunt uglify" 
    }, 
    "devDependencies": { 
        "grunt": "~0.4.4", 
        "grunt-contrib-uglify": "^0.4.0" 
    } 
    

    это очевидно, не работал, потому что heroku не устанавливает devDependencies.

  2. После этого я установил buildpack, добавил задачу heroku в свой Gruntfile.js, удалил скрипт postinstall и попытался нажать.

    Это также не увенчалось успехом, потому что buildpack только установил grunt-cli и ворчал, но не grunt-contrib-uuglify.

  3. следующий Я переехал grunt & grunt-contrib-uuglify в зависимости от devDependencies. (если я перейду, угадай, почему я не должен двигаться хрюкать).Таким образом, это сработало, но заставило меня почувствовать: зачем мне нужен buildpack, если мне нужно добавить grunt к зависимостям?

  4. Я вернулся к buildpack по умолчанию

    heroku config:unset BUILDPACK_URL 
    

    и добавил скрипт постустановочных упомянутый выше. это не работает, потому что команда grunt все еще отсутствует.

  5. Наконец, я также добавил grunt-cli к зависимостям, и он работает сейчас, без buildpack!

Заключение: вам не нужен строительный пакет - и добавьте свои зависимости от зависимости от «зависимостей». Или, строительный пакет должен исправить эту проблему: https://github.com/mbuchetics/heroku-buildpack-nodejs-grunt/issues/5

Смежные вопросы