How to deploy node app that uses grunt to heroku
gruntjs, heroku, node.js, npm
Solution
npm has a support for a `postinstall` step (among many others) that might be just what you're looking for.
The node.js heroku buildpack runs this command when you push to heroku to resolve build dependencies:
$ npm install --production
https://devcenter.heroku.com/articles/nodejs-support#build-behavior
If you take a look at the npm documentation, you can setup a series of scripts to run either before or after anyone runs `npm install` for your package. It's configured in the `scripts` property of `package.json`. The `scripts` property allows to run custom scripts (including `grunt`) when certain things happen in a package's lifecycle.
For example, to echo some text and run the `grunt` command whenever anyone (including Heroku) runs `npm install`, add this to your `package.json`:
{
...
"scripts": {
"postinstall": "echo postinstall time; ./node_modules/grunt-cli/bin/grunt <your task name>"
},
...
}
https://npmjs.org/doc/scripts.html
Important caveats:
- You might have to change the path to the grunt binary in the `postinstall` script, check the error output if the `grunt` command doesn't execute.
- `grunt` and `grunt-cli` must be listed as a `dependency` in your `package.json` so it gets installed by Heroku. Listing them under `devDependencies` is not sufficient since Heroku won't install those. Also, note that Heroku won't install it as a global package so to execute it on Heroku you're going to have to use a relative path (as it is configured above).
If this doesn't work (you'll probably need to fiddle with the relative paths a bit), then you might want to consider writing your own custom buildpack for Heroku.
Update
As of 0.4, the `grunt` package no longer contains the `grunt` binary, which is now part of the `grunt-cli` package. The answer has been updated to reflect this.
Problem
I'm using grunt and also grunt plugins like `grunt-contrib-copy`, `grunt-contrib-mincss` (that listed as npm dependencies for my application). Also I don't commit `npm_modules` folder and `public` folder, where all generated files are. And I can't figure out how to build my app (I have `grunt build` command) after deploy and setup my server (it's already looking for `public` folder). I saw some stuff like `grunt-heroku-deploy`, but it seems me a bad idea to commit before upload. Maybe there are some gentle decisions... Any thoughts?