2015-09-17 2 views
4

Я пытаюсь использовать grunt-newer для просмотра файлов из папки и, если они есть, вызывает пользовательскую задачу.Использовать Grunt newer с пользовательской задачей

У меня есть что-то подобное в моих Gruntfile.js:

grunt.initConfig({ 
    watch: { 
     widgets: { 
     files: "/somepath/*.js", 
     tasks: ['newer:mycustomtask'] 
     } 
    } 
}); 

grunt.registerTask("mycustomtask", ["description of my task"], function() { 
    console.log("me has been triggered"); 
}); 

Всякий раз, когда я бегу «черновую часы», у меня есть этот выход:

Running "watch" task 
Waiting... 
File "/somepath/WidgetA.js" changed. 
Running "newer:mycustomtask" (newer) task 
Fatal error: The "newer" prefix is not supported for aliases 

Я гугле, но ничего не найдено об этом. Кто-нибудь знает, как я могу это реализовать? Мне нужно сейчас в моем «customtask», какие файлы были изменены

ответ

-1

Вам просто нужно иметь запись конфигурации (даже пустой) для вашей задачи:

grunt.initConfig({ 

    mycustomtask: { 
    }, 

    watch: { 
    widgets: { 
     files: "/somepath/*.js", 
     tasks: ['newer:mycustomtask'] 
    } 
    } 
}); 
+0

он не работает. – miukki

1

Если вы ссылаетесь на задаче (внутри смотреть или параллельно, например), который либо не установлен, либо не настроен вы получаете этот выход ошибки.

Это происходит часто, когда вы копируете вставку конфигурации часов из другого проекта.

0

Я столкнулся с аналогичным требованием, и решение, с которым я закончил, примерно следующее. Предположим, что структура проекта:

Gruntfile.js 
package.json 
src/ 
    config.js 
    data.js 
tasks/ 
    customtask.js 

Здесь, каталог src содержит данные, которые будут контролироваться watch, в то время как определение пользовательской задачи хранится в tasks/customtask.js. Для этого примера, эта задача будет печатать только имена файлов измененных файлов:

var fs = require('fs'); 
var path = require('path'); 

module.exports = function(grunt) { 
    grunt.registerMultiTask('customtask', function() { 
     var done = this.async(); 

     if(!this.files){ done(); return; } 

     this.files[0].src.forEach(file_name => { 
      console.log(file_name); 
     }); 

     done(); 
    }); 
}; 

Теперь Gruntfile.js выглядит следующим образом:

module.exports = function(grunt) { 

    const files = ['src/config.js', 'src/data.js']; 

    grunt.initConfig({ 

     pkg: grunt.file.readJSON('package.json'), 

     customtask: { 
      release: { 
       src: files 
      } 
     }, 

     watch: { 
      data: { 
       files: files, 
       tasks: ['customtask:release'] 
      }, 
      options: { 
       spawn: false 
      } 
     } 

    }); 

    grunt.loadTasks('tasks'); 
    grunt.loadNpmTasks('grunt-contrib-watch'); 

    var changedFiles = Object.create(null); 
    var onChange = grunt.util._.debounce(function() { 
     grunt.config('customtask.release.src', Object.keys(changedFiles)); 
     changedFiles = Object.create(null); 
    }, 200); 
    grunt.event.on('watch', function(action, filepath) { 
     changedFiles[filepath] = action; 
     onChange(); 
    }); 

    grunt.registerTask('build', ['watch:data']); 
}; 

здесь, он указывает, что:

  1. искомые файлы: ['src/config.js', 'src/data.js']
  2. что наш customtask работает в принципе на этих файлах (в c аза он будет вызываться непосредственно)
  3. что watch должен соблюдать эти файлы и запускать customtask:release всякий раз, когда что-то меняется
  4. grunt.loadTasks('tasks') нагрузок все «задача определение» из каталога tasks, то есть здесь только customtask
  5. grunt.registerTask('build', ['watch:data']) Определяет «ярлык» для watch:data

Наконец, для того, чтобы ссылаться на customtask только для измененных файлов, этот пример использует стратегию, используемую в documentation в разделе «Компиляция файлов по мере необходимости». В свободном выражении он собирает все измененные файлы в объекте, ключи которого затем используются для изменения свойства src объекта customtask на лету.

Запуск grunt build затем инициирует «часы».Если один работает в другом окне терминала, например touch src/*.js, выход:

Running "watch:data" (watch) task 
Waiting... 
>> File "src/config.js" changed. 
>> File "src/data.js" changed. 

Running "customtask:release" (customtask) task 
src/config.js 
src/data.js 

где последние две строки из customtask ...

Смежные вопросы