From f13de6b3d6256f457da0a3c8274ba33656f8df4f Mon Sep 17 00:00:00 2001 From: Rick Waldron Date: Tue, 12 Jun 2012 12:52:30 -0400 Subject: [PATCH] Simplify the terminal command args syntax for custom builds. Update README --- README.md | 19 ++++++++++---- grunt.js | 74 +++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 81 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 77632bb8c..4f077c360 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ The built version of jQuery will be put in the `dist/` subdirectory. Starting in jQuery 1.8, special builds can now be created that optionally exclude or include any of the following modules: - ajax +- css - dimensions - effects - offset @@ -85,34 +86,42 @@ To create a custom build, use the following special `grunt` commands: Exclude **ajax**: ```bash -grunt build:*:*:-ajax +grunt custom:-ajax +``` + +Exclude **css**: + +```bash +grunt custom:-css ``` Exclude **dimensions**: ```bash -grunt build:*:*:-dimensions +grunt custom:-dimensions ``` Exclude **effects**: ```bash -grunt build:*:*:-effects +grunt custom:-effects ``` Exclude **offset**: ```bash -grunt build:*:*:-offset +grunt custom:-offset ``` Exclude **all** optional modules: ```bash -grunt build:*:*:-ajax:-dimensions:-effects:-offset +grunt custom:-ajax,-css,-dimensions,-effects,-offset ``` +Note: dependencies will be handled internally, by the build process. + Running the Unit Tests -------------------------------------- diff --git a/grunt.js b/grunt.js index f34e3bb7b..37fd58de8 100644 --- a/grunt.js +++ b/grunt.js @@ -181,7 +181,41 @@ module.exports = function( grunt ) { }); + // Special "alias" task to make custom build creation less grawlix-y + grunt.registerTask( "custom", function() { + var done = this.async(), + args = [].slice.call(arguments), + modules = args.length ? args[0].replace(/,/g, ":") : ""; + + + // Translation example + // + // grunt build:+ajax,-dimensions,-effects,-offset + // + // Becomes: + // + // grunt build:*:*:-ajax:-dimensions:-effects:-offset + + grunt.log.writeln( "Creating custom build...\n" ); + + grunt.utils.spawn({ + cmd: "grunt", + args: [ "build:*:*:" + modules ] + }, function( err, result ) { + if ( err ) { + grunt.verbose.error(); + done( err ); + return; + } + + grunt.log.writeln( result.replace("Done, without errors.", "") ); + + done(); + }); + }); + // Special concat/build task to handle various jQuery build requirements + // grunt.registerMultiTask( "build", "Concatenate source (include/exclude modules with +/- flags), embed date/version", @@ -190,6 +224,7 @@ module.exports = function( grunt ) { var i, compiled = "", modules = this.flags, + explicit = Object.keys(modules).length > 1, optIn = !modules["*"], name = this.file.dest, excluded = {}, @@ -208,6 +243,7 @@ module.exports = function( grunt ) { } }; + // figure out which files to exclude based on these rules in this order: // explicit > implicit (explicit also means a dependency/dependent that was explicit) // exclude > include @@ -215,9 +251,9 @@ module.exports = function( grunt ) { // *: none (implicit exclude) // *:* all (implicit include) // *:*:-effects all except effects (explicit > implicit) - // *:*:-css all except css and it's deps (explicit) - // *:*:-css:+effects all except css and it's deps (explicit exclude from dep. trumps explicit include) - // *:+effects none except effects and it's deps (explicit include from dep. trumps implicit exclude) + // *:*:-css all except css and its deps (explicit) + // *:*:-css:+effects all except css and its deps (explicit exclude from dep. trumps explicit include) + // *:+effects none except effects and its deps (explicit include from dep. trumps implicit exclude) this.file.src.forEach(function( filepath ) { var flag = filepath.flag; @@ -236,13 +272,37 @@ module.exports = function( grunt ) { // conditionally concatenate source this.file.src.forEach(function( filepath ) { - var flag = filepath.flag; + var flag = filepath.flag, + specified = false, + message = ""; + if ( flag ) { if ( excluded[ flag ] !== undefined ) { - log.writeln( "Excluding " + flag + ": '" + filepath.src + "'." ); - return; + message = ( "Excluding " + flag ).red; + specified = true; + } else { + message = ( "Including " + flag ).green; + + // If this module was actually specified by the + // builder, then st the flag to include it in the + // output list + if ( modules[ "+" + flag ] ) { + specified = true; + } } - log.writeln( "Including " + flag + ": '" + filepath.src + "'." ); + + // Only display the inclusion/exclusion list when handling + // an explicit list. + // + // Additionally, only display modules that have been specified + // by the user + if ( explicit && specified ) { + grunt.log.writetableln([ 27, 30 ], [ + message, + ( "(" + filepath.src + ")").grey + ]); + } + filepath = filepath.src; }