8

I'm using grunt-contrib's concat and uglify modules to process some javascript. Currently if src/js/ is empty, they will still create an (empty) concat'd file, along with the minified version and a source map.

I want to task to detect if the src/js/ folder is empty before proceeding, and if it is, then the task should skip (not fail). Any ideas how to do this?

jtfairbank
  • 2,311
  • 2
  • 21
  • 33

3 Answers3

3

The solution may not be the prettiest, but could give you an idea. You'll need to run something like npm install --save-dev glob first. This is based on part of the Milkshake project you mentioned.

grunt.registerTask('build_js', function(){
  // get first task's `src` config property and see
  // if any file matches the glob pattern
  if (grunt.config('concat').js.src.some(function(src){
    return require('glob').sync(src).length;
  })) {
    // if so, run the task chain
    grunt.task.run([
        'trimtrailingspaces:js'
      , 'concat:js'
      , 'uglify:yomama'
    ]);
  }
});

A gist for comparison: https://gist.github.com/kosmotaur/61bff2bc807b28a9fcfa

Kosmotaur
  • 1,686
  • 14
  • 20
2

With this plugin:

https://www.npmjs.org/package/grunt-file-exists

You can check file existence. (I didn't try, but the source looks like supporting grunt expands. (*, ** ...)

For example like this::

grunt.initConfig({
  fileExists: {
    scripts: ['a.js', 'b.js']
  },
});

grunt.registerTask('conditionaltask', [
    'fileExists',
    'maintask',
]);

But maybe if the file doesn't exist it will fail with error instead of simple skip. (I didn't test it.)

If this is a problem you can modify a bit the source of this plugin to run the related task if the file exists:

The config:

grunt.initConfig({
  fileExists: {
    scripts: ['a.js', 'b.js'],
    options: {tasks: ['maintask']}
  },
});

grunt.registerTask('conditionaltask', [
    'fileExists',
]);

And you should add this:

grunt.task.run(options.tasks);

In this file:

https://github.com/alexeiskachykhin/grunt-file-exists/blob/master/tasks/fileExists.js

after this line:

grunt.log.ok();
Lajos Veres
  • 13,595
  • 7
  • 43
  • 56
  • Looks like it'll work, but I'd prefer a cleaner solution than using a patched version of grunt-file-exists. :) – jtfairbank Mar 23 '14 at 15:53
2

Maybe this is just a more up-to-date answer as the others are more than a year old, but you don't need a plugin for this; you can use grunt.file.expand to test if files matching a certain globbing pattern exist.

Update of @Kosmotaur's answer (path is just hard-code here though for simplicity):

grunt.registerTask('build_js', function(){
  // if any file matches the glob pattern
  if (grunt.file.expand("subdir/**/*.js").length) { /** new bit here **/ 
    // if so, run the task chain
    grunt.task.run([
        'trimtrailingspaces:js'
      , 'concat:js'
      , 'uglify:yomama'
    ]);
  }
});
Marc Stober
  • 10,237
  • 3
  • 26
  • 31
  • 1
    Thanks for the update Marc! Could you provide a bit more context for your code? Would I use that directly in a `src` string value or `files` array? Or would I use it in the top part of the function like @Kosmotaur did? If so, could you mimic his layout and provide a full example function? – jtfairbank Jan 11 '16 at 13:30
  • Worked for me,Thanks! – Parashuram Feb 06 '19 at 04:22