I've been having some success doing just that with grunt plugin assemble. I made a couple of vids when I first started using it:
http://www.youtube.com/watch?v=oRwL5Y7K0CM (5:43)
http://www.youtube.com/watch?v=R9Jj9ciA2wM (16:44)
Here's the official site:
https://github.com/assemble/assemble
From that site you can see how partials can be used; for example:
assemble: {
options: {
assets: 'assets',
partials: ['docs/includes/**/*.hbs'],
data: ['docs/data/**/*.{json,yml}']
},
pages: {
src: ['docs/*.hbs'],
dest: './'
}
}
Then essentially you're able to run something like:
grunt assemble
or for more fine grained control you can execute a task of the assemble target like:
grunt assemble:your_target
It's working well for me. It does require a bit of a learning curve and the docs will likely improve as they continue to work on it.