How can I skip a grunt task if a directory is empt

2019-03-26 14:09发布

问题:

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?

回答1:

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



回答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();


回答3:

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'
    ]);
  }
});