grunt watch - использовать формат массива файлов в качестве источника

Я использую grunt-contrib-less и grunt-contrib-watch вместе. Моя задача less использует формат массива файлов для определения нескольких src и dest. Я хотел бы сослаться на те же файлы из задачи просмотра. Так:

grunt.initConfig({
  less: {
    build: {
      files: [
        {src: 'src/aa.less', dest: 'dest/a.css'},
        {src: 'src/aa1.less', dest: 'dest/a1.css'}
      ]
    }
  },
  watch: {
    less: {
      files: '<%= less.build.files %>',
      tasks: ['less']
    }
  }
});

Этот шаблон подчеркивания работает, но часы не могут обрабатывать формат массива файлов, он принимает ввод файла только в виде строки или массива строк. Вот что я пробовал:

  • '<%= less.build.files.src %>' не работает, потому что less.build.files — это массив, а не объект.

  • '<%= _(less.build.files).pluck("src").value() %>' не работает, потому что, несмотря на то, что он составляет правильный список файлов, он разрешается в одну строку 'src/aa.less,src/aa1.less', а не в массив.

  • '{<%= _(less.build.files).pluck("src") %>}' работает, как предлагается здесь https://stackoverflow.com/a/21608021/490592, но это не так хорошо чувстовать. Я пытаюсь настроить таргетинг на определенный набор файлов, а не на совпадение с шаблоном из всего каталога моего проекта.

  • grunt.config.set('watch.less.files', _(grunt.config.get('less.build.files')).pluck('src').value()); работает, но это должно быть отдельно от initConfig.

Есть ли более элегантный способ сделать это?


person Chad von Nau    schedule 02.05.2014    source источник


Ответы (2)


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

var yourFiles = [
    {src: 'src/aa.less', dest: 'dest/a.css'},
    {src: 'src/aa1.less', dest: 'dest/a1.css'}
];

grunt.initConfig({
    less: {
        build: {
            files: yourFiles 
        }
    },
    watch: {
        less: {
            files: yourFiles 
            tasks: ['less']
        }
    }
});

P.S. Возможно, вам понравится читать это, чтобы узнать, что происходит под капотом при обращении к переменным в шаблонах, для более продвинутого взлома позже.

person oligofren    schedule 02.07.2015
comment
Я думаю, что вы, возможно, неправильно прочитали вопрос. Задача наблюдения не работает с форматом массива файлов. - person Chad von Nau; 03.07.2015
comment
должно быть. не было набора файлов для проверки конфигурации. - person oligofren; 06.07.2015
comment
олигофрен, с опозданием принимаю твой ответ. Кто-то недавно проголосовал за мой самостоятельный ответ, и, оглядываясь назад, ваш подход лучше. Необходимо одно изменение, чтобы обойти несовместимость grunt-contrib-watch с форматом массива файлов, установите для файлов наблюдения значение yourFiles.map(i => i.src) - person Chad von Nau; 22.09.2019

Я подтвердил, что grunt-contrib-watch не поддерживает формат массива файлов . Я остановился на использовании техники grunt-config-set, о которой упоминал выше.

Несмотря на то, что часы не поддерживают формат массива файлов, я уверен, что мои пользовательские задачи совместимы с ним, поэтому мне не нужно использовать обходные пути из моего вопроса. Я прикрепил пример. Для задач только для чтения я добавляю параметр useDest, чтобы их можно было настроить для работы с приемниками вместо src. Это помогает, когда вы хотите «включить» одну задачу в другую задачу.

module.exports = function (grunt) {

  grunt.registerMultiTask('example', 'Example read-only task', function () {
    var options = this.options({
          useDest: false, // When true, operate on dest files, instead of src
        });
        files = this.files.map(function (file) {
          return { src: (options.useDest) ? [file.dest] : file.src }
        });
    files.forEach(function (file) {
      grunt.log.writeln('Source: ' + grunt.log.wordlist(file.src));
    });
  });

  grunt.loadNpmTasks('grunt-contrib-concat');

  grunt.initConfig({
    concat: {
      build: {
        files: [
          { src: 'node_modules/grunt/lib/grunt/*.js', dest: 'lib.js' },
          { src: 'node_modules/grunt/internal-tasks/*.js', dest: 'tasks.js' }
        ]
      }
    },
    example: {
      build: {
        options: {
          useDest: true
        },
        files: '<%= concat.build.files %>'
      }
    }
  });

};

Задача выведет:

Running "example:build" (example) task
Source: lib.js
Source: tasks.js
person Chad von Nau    schedule 16.04.2015