Используйте Grunt более новый с пользовательской задачей

Я пытаюсь использовать 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

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


person Christian Benseler    schedule 17.09.2015    source источник


Ответы (3)


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

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

person Hafenkranich    schedule 12.04.2016

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

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 в принципе работает с этими файлами (на случай, если он будет вызываться напрямую)
  3. что watch должен наблюдать за этими файлами и запускать customtask:release всякий раз, когда что-то меняется
  4. grunt.loadTasks('tasks') загружает все "определения задач" из каталога tasks, т.е. здесь только customtask
  5. grunt.registerTask('build', ['watch:data']) определяет "ярлык" для watch:data

Наконец, чтобы вызвать customtask только для измененных файлов, в этом примере используется стратегия, используемая в документацию в разделе "Компиляция файлов по мере необходимости". Проще говоря, он собирает все измененные файлы в объект, ключи которого затем используются для изменения свойства 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...

person ewcz    schedule 19.12.2017

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

grunt.initConfig({

  mycustomtask: {
  },

  watch: {
    widgets: {
      files: "/somepath/*.js",
      tasks: ['newer:mycustomtask']
    }
  }
});
person Xavier Priour    schedule 18.09.2015