Грунтовые часы: скомпилируйте только один файл не все

У меня есть настройка grunt, чтобы скомпилировать все мои файлы кофе в javascript и поддерживать все структуры папок, используя dynamic_mappings, который отлично работает.

coffee: {
  dynamic_mappings: {
    files: [{
      expand: true,
      cwd: 'assets/scripts/src/',
      src: '**/*.coffee',
      dest: 'assets/scripts/dest/',
      ext: '.js'
    }]
  }
}

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

watch: {
  coffeescript: {
    files: 'assets/scripts/src/**/*.coffee',
    tasks: ['coffee:dynamic_mappings']
  }
}

Проблема в том, что когда один файл изменяется, он снова компилирует весь каталог кофе в Javascript, было бы здорово, если бы он только скомпилировал единственный файл кофе, который был изменен на Javascript. Возможно ли это в Grunt или это обычная функция. Ключевым моментом здесь является то, что он должен поддерживать структуру папок, иначе было бы легко.

У нас есть пользовательские скрипты часов на работе, и я пытаюсь их продать на Grunt, но для этого вам понадобится эта функция.

+7
источник поделиться
2 ответа

Вы можете использовать что-то вроде следующего файла Grunt. Всякий раз, когда файл CoffeeScript изменяется, он обновляет конфигурацию для coffee:dynamic_mappings, чтобы использовать только измененный файл как src.

Этот пример представляет собой слегка измененную версию примера в графике чтения grunt-contrib-watch.

Надеюсь, что это поможет!

var path = require("path");
var srcDir = 'assets/scripts/src/';
var destDir = 'assets/scripts/dest/';

module.exports = function( grunt ) {
    grunt.initConfig( {
        coffee: {
            dynamic_mappings: {
                files: [{
                    expand: true,
                    cwd: srcDir,
                    src: '**/*.coffee',
                    dest: destDir,
                    ext: '.js'
                }]
            }
        },
        watch : {
            coffeescript : {
                files: 'assets/scripts/src/**/*.coffee',
                tasks: "coffee:dynamic_mappings",
                options: {
                    spawn: false, //important so that the task runs in the same context
                }
            }
        }
    } );

    grunt.event.on('watch', function(action, filepath, target) {
        var coffeeConfig = grunt.config( "coffee" );
        // Update the files.src to be the path to the modified file (relative to srcDir).
        coffeeConfig.dynamic_mappings.files[0].src = path.relative(srcDir, filepath);
        grunt.config("coffee", coffeeConfig);
    } );

    grunt.loadNpmTasks("grunt-contrib-coffee");
    grunt.loadNpmTasks("grunt-contrib-watch");

    grunt.registerTask("default", [ "coffee:dynamic_mappings", "watch:coffeescript"]);
};
+9
источник

нашел решение из ответа на аналогичный вопрос fooobar.com/questions/139999/...

короткий ответ: попробуйте https://github.com/tschaub/grunt-newer

+3
источник

Связанные вопросы


Похожие вопросы

Посмотрите другие вопросы по меткам или Задайте вопрос