Подтвердить что ты не робот

Как вы смотрите несколько файлов, но только запускаете задачу на измененном файле, в Grunt.js?

Изучая, как использовать grunt, я пытаюсь сделать простой кофеер script watcher/compiler. Проблема в том, что если я расскажу о задаче watch для просмотра нескольких файлов, и один из них изменит, он передаст все файлы команде coffee. Это означает, что когда вы меняете 1 файл, он собирается перекомпилировать все файлы, соответствующие шаблону src. Вместо этого я хочу только перекомпилировать один измененный файл, соответствующий шаблону src.

Вот grunt.js:

module.exports = function(grunt) {
  grunt.initConfig({
    coffee: {
      app: {
        src: ['test/cases/controller/*.coffee'],
        dest: 'tmp',
        options: {
          bare: true,
          preserve_dirs: true
        }
      }
    },
    watch: {
      files: ['<config:coffee.app.src>'],
      tasks: ['coffee:app']
    }
  });

  grunt.loadNpmTasks('grunt-coffee');
  grunt.registerTask('default', 'coffee');
};

Это используется grunt-coffee, что в основном таково: https://gist.github.com/2373159.

Когда я запускаю grunt watch, и я сохраняю файл в test/cases/controller/*.coffee, он компилирует все соответствующие файлы (помещая их в tmp/*).

Как вы вместо этого компилируете измененный файл с помощью grunt?

4b9b3361

Ответ 1

В предстоящем (и в настоящее время в разработке) v0.4.0a grunt есть объект grunt.file.watchFiles, который был специально разработан для этой цели. Возможно, плагин grunt-coffee может добавить поддержку этой функции, я не уверен.

В любом случае, если вы заинтересованы в попытке внедрения в проекте версии grunt в вашем проекте, посмотрите Когда я смогу использовать встроенную функцию "X" '? FAQ.

Ответ 2

Я получил эту работу при компиляции моих меньших файлов. Вы должны быть в состоянии немного приспособиться к этой конфигурации к git, работая с плагином coffeescript. Интересующая часть представляет собой grunt.event.on('watch', ...). В этом обработчике событий я обновляю свойство files в команде less, чтобы содержать только измененный файл.

path = require('path');

module.exports = function(grunt) {

  // Project configuration.
  grunt.initConfig({

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

    less: {
      development: {
        options: {
          paths: ["./library/less"],
        },
        files: [
          { src: "./library/less/bootstrap.less", dest: "./library/css/bootstrap.css"},
          { src: "./library/less/app.less", dest: "./library/css/app.css"}
        ]
      }
    },

    watch: {
      styles: {
        files: "./library/less/*",
        tasks: ["less"],
        options: {
          nospawn: true,
        },
      },
    },
  });

  // Event handling
  grunt.event.on('watch', function(action, filepath){
    // Update the config to only build the changed less file.
    grunt.config(['less', 'development', 'files'], [
      {src: filepath, dest: './library/css/' + path.basename(filepath, '.less') + '.css'}
    ]);
  });

  // Load the plugins
  grunt.loadNpmTasks('grunt-contrib-less');
  grunt.loadNpmTasks('grunt-contrib-watch');

  // Tasks
  grunt.registerTask('default', ['watch']);
};

Ответ 3

Ни один из этих ответов не работал очень хорошо для меня. Вот мое решение, если кому-то интересно (я знаю, что я немного поздно отвечаю на этот вопрос).

https://gist.github.com/ryansmith94/8569178

Ответ 4

В этом issue Кайл Робинсон предлагает использовать событие watch. Очень важно установить свойство watch t nospawn на true, чтобы он работал. Я изменил его решение для выборочного запуска задач:

grunt.event.on('watch', function(action, filepath) {
    if (minimatch(filepath, grunt.config('watch.stylesheets.files'))) {
        grunt.config('compass.dist.options.specify', [filepath]);
    }

    if (minimatch(filepath, grunt.config('watch.scripts.files'))) {
        var uglifySrc = filepath.replace(grunt.config('uglify.dist.cwd'), '');
        grunt.config('jshint.dist.src', [filepath]);
        grunt.config('uglify.dist.src', [uglifySrc]);
    }
});

Вот полное решение: https://gist.github.com/luissquall/5408257

Ответ 5

https://github.com/tschaub/grunt-newer выглядит точно для похожих задач:

Настроить задачи Grunt для запуска только с более новыми файлами.

Сводка: новая задача будет настраивать другую задачу для запуска с помощью src файлы, которые a) новее, чем файлы dest, или b) новее, чем последние успешный запуск (если нет файлов dest). См. Ниже примеры и более подробно.

Вы можете легко добавить любую задачу. В вашем случае:

  grunt.loadNpmTasks('grunt-newer');
  grunt.registerTask('default', 'newer:coffee');

Ответ 6

Итак, новый для Grunt 0.4 - больше именных задач

Приведем пример!

watch: {
    package1: {
        files: [
            './modules/package1/**/*.coffee'
        ],
        tasks: ['coffee:package3']
    },
    package2: {
        files: [
            './test_packages/package2/**/*.coffee'
        ],
        tasks: ['coffee:package3']
    },
    package3: {
        files: [
            './test_packages/package3/**/*.coffee'
        ],
        tasks: ['coffee:package3']
    },
}

Чтобы запустить все эти задачи, просто выполните   grunt.registerTask('default', ['myInitialBuild', 'watch']);

Где myInitialBuild - это какая-то начальная сборка (все файлы), а затем следуйте за ней с помощью часов на каждом пакете. На самом деле вы можете сделать это для каждого файла, но это звучит сочно.

Ответ 7

Задача grunt-contrib-watch теперь поддерживает это.

https://npmjs.org/package/grunt-contrib-watch → искать "Компиляция файлов по мере необходимости"

grunt.initConfig({
  watch: {
    scripts: {
      files: ['lib/*.js'],
      tasks: ['jshint'],
      options: {
        nospawn: true,
      },
    },
  },
  jshint: {
    all: ['lib/*.js'],
  },
});

// on watch events configure jshint:all to only run on changed file
grunt.event.on('watch', function(action, filepath) {
  grunt.config(['jshint', 'all'], filepath);
});

Это должно помешать задачам компилировать все файлы каждый раз, когда что-то меняется.