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

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

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


person jtfairbank    schedule 18.03.2014    source источник
comment
Не могли бы вы опубликовать копию вашего Gruntfile.js? Вы пробовали делать все только через uglify (тоже конкатенацию), просто ради проверки?   -  person Wallace Sidhrée    schedule 21.03.2014
comment
Я специально пытаюсь решить 2-й и 3-й TODO в Gruntfile.js.   -  person jtfairbank    schedule 23.03.2014


Ответы (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

person Kosmotaur    schedule 24.03.2014
comment
Спасибо, это оказалось именно то, что мне было нужно! - person jtfairbank; 30.03.2014

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

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();
person Lajos Veres    schedule 22.03.2014
comment
Похоже, это сработает, но я бы предпочел более чистое решение, чем использование исправленной версии grunt-file-exists. :) - person jtfairbank; 23.03.2014

Возможно, это просто более актуальный ответ, поскольку другим больше года, но для этого вам не нужен плагин; вы можете использовать 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'
    ]);
  }
});
person Marc Stober    schedule 07.01.2016
comment
Спасибо за обновление Марк! Не могли бы вы предоставить немного больше контекста для вашего кода? Буду ли я использовать это непосредственно в строковом значении src или в массиве files? Или я бы использовал его в верхней части функции, как это сделал @Kosmotaur? Если да, не могли бы вы сымитировать его макет и предоставить полный пример функции? - person jtfairbank; 11.01.2016
comment
Работал для меня, спасибо! - person Parashuram; 06.02.2019