Filter output of a grunt task - gruntjs

I have several grunt tasks which internally use grunt-shell to execute various CLI commands.
I want to hide certain logs printed to the output console by these CLI commands.
Am trying to use grunt-reporter for this but unable to get it working.
Gruntfile.js
reporter: {
shell:{
options: {
tasks: ['shell'],
header: false
}
}
}

The short answer... It's not possible for grunt-reporter by itself to hide logs generated by a grunt-shell command.
The long answer including workaround... The logs from a grunt-shell command are generated by the shell/bash command itself and not via a node package/script. The examples shown on the grunt-reporter homepage are intercepting/manipulating a message from a node package written to stdout.
Consider the following...
Simple gist
module.exports = function(grunt) {
grunt.initConfig({
shell: {
listFiles: {
command: 'ls src/js/*.js'
}
}
});
require('load-grunt-tasks')(grunt);
grunt.registerTask('default', [
'shell:listFiles'
]);
};
Running $ grunt via the CLI outputs something like this:
Running "shell:listFiles" (shell) task
src/js/a.js
src/js/b.js
src/js/c.js
Done.
Hide the header...
Utilizing grunt-reporter it's possible, (at best for this scenario), to hide the header using a config as follows:
module.exports = function(grunt) {
grunt.initConfig({
reporter: {
shell: {
options: {
tasks: ['shell:listFiles'],
header: false
}
}
},
shell: {
listFiles: {
command: 'ls src/js/*.js'
}
}
});
require('load-grunt-tasks')(grunt);
grunt.registerTask('default', [
'reporter:shell', //<-- Note: The reporter task is called first.
'shell:listFiles'
]);
};
Running $ grunt via the CLI will now output something like this (Note: the header has been hidden, however the log from the ls command persists as it directly comes from the bash/shell command):
src/js/a.js
src/js/b.js
src/js/c.js
Done.
Even after adding the suppress: true to the reporter options the paths logs from the ls command persist.
Workaround
I think the only way to hide the logs from a CLI command will be to redirect the output messages to /dev/null in the 'grunt-shell' commands:
module.exports = function(grunt) {
grunt.initConfig({
reporter: {
shell: {
options: {
tasks: ['shell:listFiles'],
header: false,
}
}
},
shell: {
listFiles: {
command: 'ls src/js/*.js > /dev/null' //<-- redirect the output messages
}
}
});
require('load-grunt-tasks')(grunt);
grunt.registerTask('default', [
'reporter:shell', //<-- Note: The reporter task is called first.
'shell:listFiles'
]);
};
This time running $ grunt via the CLI successfully hides the messages/logs and only reports:
Done.
Note: The addition of > /dev/null will only redirect the messages/logs and any errors will continue to get reported. Using > /dev/null 2>&1 would also hide any errors too.

Related

Suggest deploy path in a Grunt task

I have a Grunt task to automatize the deploy of my webapp on webserver.
On My webserver I have 3 paths:
/www/myApp (production)
/www/myApp_rc
I have a package.json file
{
...
"ftpDeployPath":"myApp_rc" //or /www/myApp
...
}
and this is my task
{'ftp-deploy': {
toMyServer: {
auth: {
host: '10.7.88.87',
port: 21,
authKey: 'key1'
},
src: 'deploy',
dest: '<%= pkg.ftpDeployPath %>',
forceVerbose: true
}
}
}
When I want deploy, every time I have to check and eventually edit package.json file.
Is there any way to show a prompt (bu grunt console) to allow me to select the right deploy path?
You can probably try using grunt-prompt task with 'input' question type and your "ftpDeployPath" as 'config'. Or, modify your gruntfile to use command line options (http://gruntjs.com/frequently-asked-questions#dynamic-alias-tasks) and run your tasks as external tools from WebStorm (Settings | Tools | External tools) - you can add $Prompt$ macro to tool parameters to get a prompt for option value when running a tool
Using a combination of command line arguments and a custom task, you can modify configuration for tasks before you run them. Let's start first by modifying the template string for dist; change it to access a grunt.option() param called deployPath our custom task will set:
grunt.initConfig({
'ftp-deploy': {
toMyServer: {
auth: {
host: '10.7.88.87',
port: 21,
authKey: 'key1'
},
src: 'deploy',
dest: '<%= grunt.option('deployPath') %>',
forceVerbose: true
}
}
});
Next, craft a custom task that sets the grunt.option('deployPath') parameter. The task below will set deployPath to myApp when you run grunt deploy:prod. If you run just grunt deploy, the path is set to myApp_rc. Once the path is chosen, the custom then calls the ftp-deploy task:
function deployTask(grunt) {
var deployPath = (this.args[0] === 'prod') ? 'myApp' : 'myApp_rc';
grunt.option('deployPath', deployPath);
grunt.task.run('ftp-deploy');
}
grunt.registerTask('deploy', deployTask);

Looking for Modernizr references

I'm trying to use the grunt-modernizr plugin in my project but I'm receiving the following output when I run tasks:
Running "modernizr:dist" (modernizr) task
>> Explicitly including these tests:
>> pointerevents
Looking for Modernizr references
I'm not receiving any type of error the terminal just goes back to the directory that I'm in, as if it's just giving up.
Here is my grunt file:
module.exports = function(grunt) {
grunt.initConfig ({
// Do grunt-related things in here
pkg: grunt.file.readJSON('package.json'),
modernizr: {
dist: {
"dest": "javascripts/modernizr-custom.js",
"parseFiles": true,
"customTests": [],
"devFile": "javascripts/modernizr-custom.js",
"outputFile": "javascripts/min/modernizr-custom.min.js",
"tests": [
"pointerevents",
"css/pointerevents"
],
"extensibility": [
"setClasses"
],
"uglify": false
}
},
cssmin: {
target: {
files: {
'css/min/bootstrap.min.css': ['css/bootstrap.css']
}
}
},
});
grunt.loadNpmTasks("grunt-modernizr");
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.registerTask('default',['modernizr', 'cssmin']);
};
Output from running grunt --verbose:
Initializing
Command-line options: --verbose
Reading "gruntfile.js" Gruntfile...OK
Registering Gruntfile tasks.
Reading package.json...OK
Parsing package.json...OK
Initializing config...OK
Registering "grunt-modernizr" local Npm module tasks.
Reading /Applications/MAMP/htdocs/bootstrap-three-wordpress/wp-content/themes/brandozz/node_modules/grunt-modernizr/package.json...OK
Parsing /Applications/MAMP/htdocs/bootstrap-three-wordpress/wp-content/themes/brandozz/node_modules/grunt-modernizr/package.json...OK
Loading "modernizr.js" tasks...OK
+ modernizr
Registering "grunt-contrib-cssmin" local Npm module tasks.
Reading /Applications/MAMP/htdocs/bootstrap-three-wordpress/wp-content/themes/brandozz/node_modules/grunt-contrib-cssmin/package.json...OK
Parsing /Applications/MAMP/htdocs/bootstrap-three-wordpress/wp-content/themes/brandozz/node_modules/grunt-contrib-cssmin/package.json...OK
Loading "cssmin.js" tasks...OK
+ cssmin
Loading "gruntfile.js" tasks...OK
+ default
No tasks specified, running default tasks.
Running tasks: default
Running "default" task
Running "modernizr" task
Running "modernizr:dist" (modernizr) task
Verifying property modernizr.dist exists in config...OK
Files: -> javascripts/modernizr-custom.js
Verifying property modernizr exists in config...OK
>> Explicitly including these tests:
>> pointerevents
Looking for Modernizr references
This is something I just came across too and seems to be grunt-modernizr stopping after customizr doesn't find any files to crawl (it crawls by default).
If you add "crawl": false to your modernizr:dist task that should fix the problem.
Also, I think "extensibility": [ "setClasses" ], should be "options": [ "setClasses" ],.
To use the grunt-modernizr task to crawl your code for Modernizr references you'll have to look at the config properties for the customizr task as this is part of grunt-modernizr 's node_modules:
modernizr: {
dist: {
dest: 'bower_components/modernizr/build/modernizr.custom.js',
uglify: false,
options: [
'setClasses',
'addTest'
],
files: {
src: ['js/app/**/*.js', 'js/app/*.js']
}
}
}
devFile: doesn't seem to matter where you point at
dest: instead of outputFile, note I'm just outputting to a build directory that's not part of the package
uglify: false if you have other minifying options like bundleconfig.json
options: to bypass the default options { "setClasses", "addTest", "html5printshiv", "testProp", "fnBind" }
files: to enlist your crawlable director(y|ies), make sure you take care of the root files and/or subdirectories as well
Load the required tasks, in my case:
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-modernizr');
grunt.loadNpmTasks('grunt-contrib-copy');
Refer to the 'modernizr:dist' task => grunt.registerTask('default', ['clean', 'modernizr:dist', 'copy']);
Which results in an unminified 34kb file:
Running "clean:files" (clean) task
19 paths cleaned.
Running "modernizr:dist" (modernizr) task
Looking for Modernizr references
1 match in js/app/classes/yambo.options.js
bgpositionxy
1 match in js/app/modules/yambo.audio.js
audio
Ready to build using these settings:
setClasses, addTest
Building your customized Modernizr...OK
Success! Saved file to bower_components/modernizr/build/modernizr.custom.js
Process terminated with code 0.
Running "copy:main" (copy) task
Copied 11 files
Done, without errors.
This way there's no need to even go to the online build to add a feature test. Simply reference Modernizr throughout your js code:
window.Yambo = (function($, modernizr, ns){
ns.Audio = {
extension: (function () {
return modernizr && modernizr.audio.mp3
? 'mp3'
: modernizr.audio.ogg
? 'ogg'
: 'wav';
}())
};
return ns;
}(window.jQuery, window.Modernizr, window.Yambo || {}));
Make sure to use the correct property name for a feature detection, so customizr can pick it up and provide a test to your custom build.
This should be also possible for css but haven't been testing that for the moment.
It looks like you missed source files.
http://gruntjs.com/configuring-tasks#files-object-format
Try to include
"dist": {
"files": {
"src": ['!<%= appDir %>assets/js/bower/modernizr/**']
}
}

sails js add a custom task

I am trying to add custom task to a sails js application. accroding to the documentation I create files in the following way.
tasks/register/test.js
module.exports = function (grunt) {
grunt.registerTask('test', ['mochaTest']);
};
tasks/config/mochaTest.js
module.exports = function(grunt) {
grunt.config.set('mochaTest', {
test: {
options: {
reporter: 'spec',
captureFile: 'results.txt', // Optionally capture the reporter output to a file
quiet: false, // Optionally suppress output to standard out (defaults to false)
clearRequireCache: false // Optionally clear the require cache before running tests (defaults to false)
},
src: [
'test/bootstrap.test.js',
'test/unit/**/*.js'
]
}
});
grunt.loadNpmTasks('grunt-mocha-test');
};
I have written test cases inside test/unit folder. I can run these test using grunt mochaTest command. But using 'sails lift --test' command does not run the test cases. instead it just run the sails application. I also tried the following command. ()
NODE_ENV=test sails lift
It also does not run the test cases. It just run the sails application. (http://sailsjs.org/documentation/concepts/assets/task-automation)
What am I missing here ?
Modify the file "tasks/register/default.js" to have the following code:
module.exports = function (grunt) {
grunt.registerTask('default', ['compileAssets', 'linkAssets', 'grunt-mocha-test', 'watch']);
};
then just launch the app with "sails lift"

Sending specs in grunt using grunt-protractor-runner

I am using grunt-protractor-runner plugin and in the protractor target I want to send the specs param containing the test to run.
In the grunt file my target looks as follows:
testIntegration:
{
options:
{
args: {
specs: ['test1.js'],
browser: 'firefox'
}
}
The protractor parent task option contains setting of the protractor config file.
When running this target I get this error:
$ grunt protractor:testIntegration
Running "protractor:testIntegration" (protractor) task
Starting selenium standalone server...
Selenium standalone server started at ...
Warning: pattern t did not match any files.
Warning: pattern e did not match any files.
Warning: pattern s did not match any files.
Warning: pattern t did not match any files.
Warning: pattern 1 did not match any files.
Warning: pattern j did not match any files.
Warning: pattern s did not match any files.
and then some more errors.
the same line works well in Protractor config file.
Tried a few other variation but no success.
What am I missing? Any ideas?
Try this configuration:
module.exports = function(grunt) {
// Project configuration
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
protractor: {
options: {
keepAlive: true,
singleRun: false,
configFile: "PROTRACTOR_CONFIG_FILE.js"
},
run_firefox: {
options: {
args: {
browser: "firefox"
}
}
}
});
// load grunt-protractor-runner
grunt.loadNpmTasks('grunt-protractor-runner');
// register tasks
grunt.registerTask('default', 'Run Protractor using Firefox',
['protractor:run_firefox']);
};
Funny, if you read every error message, it spells out "test1.js". Looks like it's not reading in the config file correctly, probably because you're not using grunt.file.readJSON('FILENAME.json')

How to configure more than one svninfo object with grunt-svninfo?

I need to have two svninfo objects of two different svn repositories. The svn information of the app should be stored in the object svninfo_app and the svn information of the elstr repository (external) should be stored in svninfo_elstr:
information of repo app -> svninfo_app
information of repo elstr -> svninfo_elstr
My Gruntfile.js
module.exports = function(grunt) {
grunt.initConfig({
svninfo: {
options: {
output: 'svninfo_app',
cwd: '.'
},
elstr: {
options: {
output: 'svninfo_elstr',
cwd: './public/jslib/elstr/2.0.dev'
}
}
},
svn_export: {
dev: {
options: {
repository: '<%= svninfo_elstr.url %>',
output: 'deploy/'
}
}
}
});
// https://npmjs.org/package/grunt-svninfo
grunt.loadNpmTasks('grunt-svninfo');
grunt.loadNpmTasks('grunt-svn-export');
// Default task.
grunt.registerTask('default', ['svninfo','svn_export']);
};
Returns a warning and aborts:
Running "svninfo" task
SVN info fetched (rev: 4)
Running "svn_export:dev" (svn_export) task
Warning: An error occurred while processing a template (Cannot read property 'url' of undefined). Use --force to continue.
Aborted due to warnings.
The object svninfo_elstr is undefined. Why this?
How to configure more than one svninfo object with grunt-svninfo?
Now I found a working solution. The following Gruntfile.js
module.exports = function(grunt) {
grunt.initConfig({
svninfo: {
options: {
output: 'svninfo_app',
cwd: '.',
elstrCwd: './public/jslib/elstr/2.0.dev'
}
}
});
// https://npmjs.org/package/grunt-svninfo
grunt.loadNpmTasks('grunt-svninfo');
// Default task.
grunt.registerTask('default', ['svninfo','svninfo:svninfo_elstr:elstrCwd']);
};
Returns
Running "svninfo" task
SVN info fetched (rev: 5)
Running "svninfo:svninfo_elstr:elstrCwd" (svninfo) task
SVN info fetched (rev: 305)
Done, without errors.
It it necessary to register tow tasks:
'svninfo' -> returns the informations into the object svninfo_app with default options
'svninfo:svninfo_elstr:elstrCwd' -> returns the information into the object svninfo_elstr with options elstrCwd
Well, there's no property named svninfo_elstr, as the error message says. Your Grunt config doesn't have any svninfo_elstr properties.
How to configure more than one svninfo object with grunt-svninfo?
Maybe it would help to update the post with what you're trying to accomplish in more detail? E.g. what would it look like without the <%= %> stuff?

Resources