2015-01-13 48 views
2

我正在使用grunt进行项目工作,之前我没有与grunt一起工作过,而且当前设置为监视文件以及文件已更改时重新编译所有文件(包含数百个文件的多个子目录)将句柄转换为html,这很慢。我想通过只编译需要的东西来提高速度。Grunt:监视文件更改并编译父目录

使用grunt newer监视文件并不真正起作用,因为目录中存在依赖关系,因此仅重新编译已更改的文件将不会生成有效的页面。

我基本上需要重新编译已更改文件的整个父目录,但我不太确定如何配置类似的东西。

任何提示,我应该看看?

的组装本身配置是这样的:

var _ = require('lodash'); 
var path = require('path'); 
// expand the data files and loop over each filepath 
var pages = _.flatten(_.map(grunt.file.expand('./src/**/*.json'), function(filepath) { 
    // read in the data file 
    var data = grunt.file.readJSON(filepath); 
    var dest=path.dirname(filepath)+ '/' +path.basename(filepath, path.extname(filepath)); 
    dest=dest.replace("src/",""); 
    var hbs; 
    if (data.hbs){ 
     hbs=grunt.file.read(path.dirname(filepath)+ '/' + data.hbs) 
    } 

    // create a 'page' object to add to the 'pages' collection 
    return { 
    // the filename will determine how the page is named later 
    filename: dest, 
    // the data from the json file 
    data: data, 
    // add the recipe template as the page content 
    content:hbs 
    }; 
})); 

return { 
    options: { 
     /*postprocess: require('pretty'),*/ 
     marked: {sanitize: false}, 
     data: '<%= options.src %>/**/*.json', 
     helpers: '<%= options.src %>/helpers/helper-*.js', 
     layoutdir: '<%= options.src %>/templates', 
     partials: ['<%= options.src %>/components/**/*.hbs'] 
    }, 
    build: { 
     options: { 
      layout: 'base.hbs', 
      assets: '<%= options.build %>', 
      pages: pages 
     }, 
     files: [ 
      { 
       cwd: '<%= options.src %>', 
       dest: '<%= options.build %>', 
       src: '!*' 
      } 
     ] 
    }, 
} 

所以每到这个时候加载所有网页被扫描下来象/src/sites/abc/xyz/foo.json和被编译,但只有我想要更改文件。 Watch确实检测到已更改的文件,但是所有文件都会重新编译,我不知道如何才能将已在配置中识别的已更改文件仅处理部分文件。

+0

你能否告诉我们质疑相关的配置? – raidendev

+0

当然,我已经添加了我所了解的组装过程的基本代码。 – bardiir

回答

1

我觉得你需要的东西已经在那里了。

在grunt文档中检查Using the watch event

复制这里的内容以满足SO MODS/GODS

此任务将在观看文件被修改时发出监视事件。如果您希望编辑文件时发生简单的通知,或者如果您将此任务与其他任务配合使用,此功能非常有用。以下是一个使用手表事件的简单示例:

grunt.initConfig({ 
    watch: { 
    scripts: { 
     files: ['lib/*.js'], 
    }, 
    }, 
}); 
grunt.event.on('watch', function(action, filepath, target) { 
    grunt.log.writeln(target + ': ' + filepath + ' has ' + action); 
}); 

watch事件不适用于替换用于配置和运行任务的标准Grunt API。如果你试图从watch事件中运行任务,你很可能会做错了。请阅读配置任务。

编译所需文件

一个非常普遍的要求是根据需要只编译文件。这里只会皮棉改变与jshint任务文件的示例:

grunt.initConfig({ 
    watch: { 
    scripts: { 
     files: ['lib/*.js'], 
     tasks: ['jshint'], 
     options: { 
     spawn: false, 
     }, 
    }, 
    }, 
    jshint: { 
    all: { 
     src: ['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.src', filepath); 
}); 

如果你需要动态地修改你的配置,产卵选项必须被禁用,以保持相同的环境下运行的手表。

如果同时保存多个文件,你可以选择一个更强大的方法:

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

谢谢,使用事件挂钩我可以扫描目录文件,然后将它们放入汇编过程。 'spawn:false'对于这个解决方案来说非常重要 - 我不介意在一个新的线程中产生组装过程,在这个新线程中选项恢复为默认值。 – bardiir

+0

当我需要做这样的事情时,我会记住。 – Vishwanath