2015-01-13 84 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