Upgrading from 0.3 to 0.4 - Ramanonos/grunt GitHub Wiki
Note that even if you are familiar with grunt, it would be worthwhile to read the new Getting started guide.
Grunt is now split into three parts: grunt, grunt-cli and grunt-init.
- The npm module
gruntshould be installed locally to your project. It contains the code and logic for running tasks, loading plugins, etc. - The npm module
grunt-clishould be installed globally. It puts thegruntcommand in your PATH so you can execute it anywhere. By itself, it doesn't do anything; its job is to load and run the Grunt that has been installed locally to your project, regardless of the version. For more information about why this has changed, please read npm 1.0: Global vs Local installation. - The
inittask has been broken into its own npm module,grunt-init. It should be installed globally withnpm install -g grunt-initand run with thegrunt-initcommand. In the coming months, Yeoman will completely replace grunt-init. See the grunt-init project page for more information.
All grunt-contrib-* series plugins are Grunt 0.4 ready. However, it is highly unlikely that third party plugins written for Grunt 0.3 will continue to work with 0.4 until they have been updated. We are actively working with plugin authors to ensure this happens as swiftly as possible.
A forthcoming Grunt release will be focused on decoupling grunt's architecture so that plugins are not affected by future updates.
- Grunt now requires Node.js version
>= 0.8.0
- The "Gruntfile" has changed from
grunt.jstoGruntfile.js. - CoffeeScript is supported in your
Gruntfile.coffeeprojectGruntfileor*.coffeetask files (transpiling to JS happens automatically).
See the "The Gruntfile" section of the Getting started guide for more information.
The eight core tasks that were included in Grunt 0.3 are now separate Grunt plugins. Each is a discrete npm module that must be installed as a plugin per the "Loading Grunt plugins and tasks" section of the Getting started guide.
- concat → grunt-contrib-concat plugin
- init → stand-alone grunt-init utility
- lint → grunt-contrib-jshint plugin
- min → grunt-contrib-uglify plugin
- qunit → grunt-contrib-qunit plugin
- server → grunt-contrib-connect plugin
- test → grunt-contrib-nodeunit plugin
- watch → grunt-contrib-watch plugin
Some task names and options have changed. Be sure to see each plugin's documentation as linked above for the latest configuration details.
The configuration format for Grunt 0.4 tasks has been standardized and greatly enhanced. See the Configuring tasks guide, as well as individual plugin documentation for more information.
- File globbing (wildcard) patterns may now be negated to exclude matched files.
- Tasks now support a standard
optionsobject. - Tasks now support a standard
filesobject.
<% %> style template strings specified as config data inside the Gruntfile are automatically expanded, see the grunt.template documentation for more information.
Directives have been removed, but their functionality has been retained. These replacements can be made:
-
'<config:prop.subprop>'→'<%= prop.subprop %>' -
'<json:file.json>'→grunt.file.readJSON('file.json') -
'<file_template:file.js>'→grunt.template.process(grunt.file.read('file.js'))
Instead of specifying a banner in a file list with '<banner>' or '<banner:prop.subprop>', the grunt-contrib-concat and grunt-contrib-uglify plugins each have a banner option.
Instead of stripping banners from files individually with '<file_strip_banner:file.js>', the grunt-contrib-concat and grunt-contrib-uglify plugins each have an option to strip/preserve banners.
When specifying an alias task, the list of tasks to run must now be specified as an array.
// v0.3.x (old format)
grunt.registerTask('default', 'jshint nodeunit concat');
// v0.4.x (new format)
grunt.registerTask('default', ['jshint', 'nodeunit', 'concat']);The aforementioned alias task change (task lists must be specified as an array) makes this possible. Just be sure to surround task arguments containing spaces with quotes when specifying them on the command line, so they can be properly parsed.
grunt my-task:argument-without-spaces "other-task:argument with spaces"The file.defaultEncoding method was added to normalize character encodings, and all grunt.file methods have been updated to support the specified encoding.
Grunt's helper system has been removed in favor of node require. For a concise example on how to share functionality between Grunt plugins, please see grunt-lib-legacyhelpers. Plugin authors are encouraged to upgrade their plugins.
The Grunt API saw substantial changes from 0.3 to 0.4.
-
grunt
- Removed
grunt.registerHelperandgrunt.renameHelpermethods.
- Removed
-
grunt.config
- Changed config.get method to automatically recursively expand
<% %>templates. - Added config.getRaw method that will retrieve raw (unexpanded) config data.
- Changed config.process method to now process a value as if it had been retrieved from the config, expanding templates recursively. This method is called internally inside of
config.get, but not inside ofconfig.getRaw.
- Changed config.get method to automatically recursively expand
- grunt.event added so that tasks may emit events.
-
grunt.fail
- Won't emit a beep if
--no-coloroption specified. - Added
fail.codeexit code map. - Removed
fail.warnAlternatemethod.
- Won't emit a beep if
-
grunt.file
- Tasks are no longer automatically loaded from
~/.grunt/tasks/directory (install them locally to your project!). - Added file.defaultEncoding method for normalizing character encoding across all
grunt.filemethods. - Added file.delete method.
- Added relatively self-explanatory file.exists, file.isDir, file.isFile, file.isLink, file.isPathCwd, file.isPathInCwd, file.doesPathContain, file.arePathsEquivalent testing methods.
- Added file.match and file.isMatch methods to facilitate matching wildcard patterns against file paths.
- Added file.expandMapping method for use in generating 1-to-1 src-dest file mappings.
- Added file.readYAML method.
- Changed file.findup to use the findup-sync module.
- Changed file.glob to use the glob module.
- Added file.minimatch which exposes the minimatch module.
- Removed
file.userDirmethod (moved into grunt-init). - Removed
file.clearRequireCachemethod. - Removed
file.expandFilesandfile.expandDirsmethods, use thefilteroption offile.expandinstead. - Removed
file.expandFileURLsmethod. Don't specify URLs where files should be specified (eg. the qunit task now allows for aurlsoption).
- Tasks are no longer automatically loaded from
-
grunt.task
- Tasks registered with both task.registerTask and task.registerMultiTask get a
this.optionsmethod. - Added task.normalizeMultiTaskFiles method to facilitate the normalization of multi task
filesobjects into thethis.fileproperty. - Removed
task.registerHelperandtask.renameHelpermethods. - Removed
task.searchDirsproperty. - Removed
task.expandtask.expandDirstask.expandFilestask.getFiletask.readDefaultsmethods (moved into grunt-init).
- Tasks registered with both task.registerTask and task.registerMultiTask get a
-
grunt.package reflects the metadata stored in grunt's
package.json. - grunt.version is the current version of Grunt as a string.
-
grunt.template
- Added template.addDelimiters method to add new template delimiters.
- Added template.setDelimiters method to select template delimiters.
- The
initandusertemplate delimiters have been removed, but you can add them in again if you need to withtemplate.addDelimiters(grunt-init uses this to enable the{% %}template delimiters).
-
grunt.util replaces the now-removed
grunt.utils.- Changed
util._to use Lo-Dash - Added the util.callbackify method.
- Changed the util.spawn method to be much better behaved and pass more consistent arguments into its callback.
- Changed
Plugin authors, please indicate clearly on your repository README which version number of your Grunt plugin breaks compatibility with Grunt 0.3.
- Multi tasks
- Multiple src-dest file mappings may now be specified per target in a
filesobject (this is optional).
- Multiple src-dest file mappings may now be specified per target in a
-
this.files / grunt.task.current.files
- The
this.filesproperty is an array of src-dest file mapping objects to be iterated over in your multi task. It will always be an array, and you should always iterate over it, even if the most common use case is to specify a single file. - Each src-dest file mapping object has a
srcanddestproperty (and possibly others, depending on what the user specified). Thesrcproperty is already expanded from whatever glob pattern the user may have specified.
- The
-
this.filesSrc / grunt.task.current.filesSrc
- The
this.filesSrcproperty is a reduced, uniqued array of all files matched by all specifiedsrcproperties. Useful for read-only tasks.
- The
-
this.options / grunt.task.current.options
- The
this.optionsmethod may be used within tasks to normalize options. Inside a task, you may specify options defaults like:var options = this.options({option: 'defaultvalue', ...});
- The
- An updated
gruntplugintemplate has been created for Grunt 0.4-compatible plugins, and is available in the standalone grunt-init.
- If you had previously installed a development version of Grunt 0.4 or any grunt-contrib plugins, be sure to flush your npm cache with
npm cache cleanfirst to ensure that you are pulling the final version of Grunt and grunt-contrib plugins.