load-grunt-parent-tasks
Version:
Loads de-duped grunt tasks from parent or sibling modules.
159 lines (116 loc) • 4.93 kB
Markdown
# load-grunt-parent-tasks
> Loads de-duped grunt tasks from parent or sibling modules.
## TL;DR
load-grunt-parent-tasks is a Grunt library that allows you to load all of your
Grunt tasks even if they are in a parent folder. This library was heavily inspired
by this StackOverflow post: ["Centralise Node Modules In Project With Subproject"](http://stackoverflow.com/questions/15225865/centralise-node-modules-in-project-with-subproject), and
and utilizes the `gruntcollection` feature of `grunt.loadNpmTasks`.
## Description
If Grunt task is loaded as a submodule then create a `grunt-collection` module
in your local `node_modules` folder to trick grunt into loading dependencies
from a parent folder. This might be necessary if project A contains a Gruntfile.js
with dependencies X, Y, and Z, and is loaded as a npm dependency of project B
which contains dependencies A, X and Y. In that scenario Npm will de-dupe
project A's Npm dependencies when executing `npm install` in project B and will
look like this:
B
├── node_modules
│ ├── A
│ │ ├── Gruntfile.js
│ │ ├── node_modules
│ │ │ └── Z
│ │ └── package.json (has depencencies X,Y,Z)
│ ├── X
│ └── Y
└── package.json (has dependencies A,X,Y)
If project A's package.json contains an `install` or `postinstall` script that
executes it's Gruntfile.js the Grunt task will throw 2 errors:
Local Npm module "X" not found. Is it installed?
Local Npm module "Y" not found. Is it installed?
Project A's Grunt task will not be able to load the de-duped dependencies because
they reside in the parents node_modules folder. This can be fixed by dropping in
a new module which contains project A's package.json with the addition of a
`keywords` property that contains `"gruntcollection"` in it's array.
B
├── node_modules
│ ├── A
│ │ ├── Gruntfile.js
│ │ ├── node_modules
│ │ │ ├── grunt-collection
│ │ │ │ └── package.json (has dependencies X,Y,Z and 'keywords: ["gruntcollection"]')
│ │ │ └── Z
│ │ └── package.json (has depencencies X,Y,Z)
│ ├── X
│ └── Y
└── package.json (has dependencies A,X,Y)
Then at the beginning of your Gruntfile.js you call `grunt.loadNpmTasks('grunt-collection')`.
Now Grunt will search up for the current directory to find the modules to load.
## Features
- Checks if the main Grunt task is a submodule of another project.
- Creates a `grunt-collection` module in your local `node_modules` folder.
- Creates a `grunt-collection/package.json` that is a mirror of your projects `package.json` file defined by `options.config`.
- Filters out npm modules to load using globbing patterns defined in `options.pattern`.
- Filters out which dependencies key to load from defined by `options.scope`.
##Installation
```bash
npm install --save load-grunt-parent-tasks
```
##Example
Basic Gruntfile.js
```javascript
module.exports = function(grunt) {
require('load-grunt-parent-tasks')(grunt);
};
```
Creates the following:
A
├── Gruntfile.js
├── node_modules
│ └── grunt-collection
│ └── package.json
└── package.json
Gruntfile.js with options
```javascript
module.exports = function(grunt) {
require('load-grunt-parent-tasks')(grunt, {
config: 'package.json',
pattern: 'grunt-*',
scope: 'dependencies',
module: 'abc-def'
});
};
// Can also be written as:
module.exports = function(grunt) {
require('load-grunt-parent-tasks')(grunt, {
config: require('package.json'),
pattern: ['grunt-*'],
scope: ['dependencies'],
module: 'abc-def'
});
};
```
Creates the following:
A
├── Gruntfile.js
├── node_modules
│ └── abc-def
│ └── package.json
└── package.json
## Options
### config
Type: `String`, `Object`
Default: Path to nearest package.json
### pattern
Type: `String`, `Array`
Default: `'grunt-*'` ([globbing pattern](https://github.com/isaacs/minimatch))
### scope
Type: `String`, `Array`
Default: `['dependencies', 'optionalDependencies']`
### module
Type: `String`
Default: `'grunt-collection'`
The `module` option can be changed in case `grunt-collection` ever conflicts with any other package name.
## Contributing
In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).
## License
[MIT](http://psyrendust.mit-license.org/2014/license.html) © [Larry Gordon](https://github.com/psyrendust)