Как я могу пропустить грубое задание, если каталог пуст

Я использую grunt-contrib's concat а также uglify модули для обработки некоторых JavaScript. В настоящее время, если src/js/ пусто, они все равно создадут (пустой) concat'd файл вместе с минимизированной версией и исходной картой.

Я хочу, чтобы задача обнаружить, если src/js/ папка пуста, прежде чем продолжить, и если это так, то задача должна пропустить (не провалиться). Есть идеи, как это сделать?

3 ответа

Решение

Решение может быть не самым красивым, но может дать вам представление. Вам нужно будет запустить что-то вроде npm install --save-dev glob первый. Это основано на части Milkshake проект, который вы упомянули.

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

Суть для сравнения: https://gist.github.com/kosmotaur/61bff2bc807b28a9fcfa

С этим плагином:

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

Вы можете проверить существование файла. (Я не пробовал, но источник выглядит как расширение поддержки grunt. (*, ** ...)

Например, вот так:

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

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

Но, возможно, если файл не существует, он потерпит неудачу с ошибкой вместо простого пропуска. (Я не проверял это.)

Если это проблема, вы можете немного изменить источник этого плагина для запуска связанной задачи, если файл существует:

Конфиг:

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

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

И вы должны добавить это:

grunt.task.run(options.tasks);

В этом файле:

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

после этой строки:

grunt.log.ok();

Возможно, это просто более актуальный ответ, так как остальным больше года, но для этого вам не нужен плагин; ты можешь использовать grunt.file.expand проверить, существуют ли файлы, соответствующие определенному шаблону глобализации.

Обновление ответа @Kosmotaur (здесь просто жесткий код, хотя для простоты):

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'
    ]);
  }
});
Другие вопросы по тегам