2013-02-25 13 views
11

Mój projekt ma ponad 300 plików CoffeeScript, więc ponowna kompilacja wszystkiego zajmuje kilka sekund. Chciałbym tylko rekompilować zmienione pliki CoffeeScript.Jak mogę użyć grunt-respecte z grunt-contrib-coffee, aby kompilować tylko zmienione pliki .coffee?

Oto najbliżej, doszedłem do tej pory, ale struktura folderów "frontend-src/coffeescript" jest kopiowana z katalogu src do katalogu docelowego.

coffee: { 
    changed: { 
    expand: true, 
    cwd: './', 
    src: ['<%= grunt.regarde.changed %>'], 
    dest: 'public/js/', 
    ext: '.js' 
    } 
}, 
regarde: { 
    coffee: { 
    files: 'frontend-src/coffeescript/**/*.coffee', 
    tasks: ['coffee:changed', 'livereload'] 
    } 
} 

Wszystko to z Gruntem 0.4.0. Każda pomoc będzie bardzo ceniona!

Odpowiedz

2

Miałem ten sam problem. Rozwiązałem go za pomocą zdarzenia regarde:file.

Najpierw słucham zmienionych plików przy użyciu zdarzenia regarde:file. Spowoduje to przesłanie konfiguracji dla dwóch zadań: clean:coffee, jeśli pliki w lokalizacji źródłowej zostały usunięte i coffee:refresh, jeśli pliki zostały zmienione/dodane.

Następnie zadanie regarde uruchomi swoje zadania, które uruchomią refresh:coffee (nie należy mylić z coffee:refresh). To zadanie sprawdzi, czy jest dodana konfiguracja dla clean:coffee i/lub dla coffee:refresh i wykona te zadania w razie potrzeby (przez funkcję grunt.task.run). Jeśli zresetuje także flagę, co spowoduje, że następne otrzymane zdarzenie zostanie ponownie wyczyszczone.

W głębi wyjaśnienie:

Przede wszystkim regarde config:

// watch for changed coffeescript files 
coffee: { 
    files: 'path/to/coffee/**/*.coffee', 
    tasks: ['refresh:coffee', 'livereload'] 
}, 

Potem wykrywać zdarzenie regarde:file, gdzie zaktualizować listy plików clean:coffee i coffee:refresh w ich konfiguracji.

Kanał konfiguracja oparta na razie regarde:file:

grunt.event.on('regarde:file', function (status, target, filepath) { 
    if (resetFlag) { 
     // clean file list from previous cycle, so clean clean:coffee and coffee:refresh 
     // file lists 
     ... 

     resetFlag = false; 
    } 
    if (status === 'deleted') { 
     if (filepath) { 
      // calculate filepath's destination and 
      // add it to clean:coffee filelist 
     } 
    } else { 
     if (!grunt.file.isDir(filepath)) { 
      // add filepath to coffee:refresh filelist 
     } 
    } 
} 

Łatwo zaktualizować konfigurację poprzez grunt.config() funkcji. Poniżej fragmentów kodu, aby przesłać pliki: coffee:refresh i clean:coffee.

Dodawanie config coffee:refresh:

var config = grunt.config('coffee') || {}; 
var value = config.refresh || {}; 
value.files = value.files || []; 
... 
var cwd = path.dirname(filepath), 
    src = path.basename(filepath), 
    dest = cwd.replace('path/to/source', 'path/to/dest'); 
    value.files.push({ 
     expand:true, 
     src:src, 
     dest:dest, 
     cwd:cwd, 
     ext:'.js' 
    }); 
grunt.config('coffee', config); 

Dodawanie config clean:coffee:

var cwd = path.dirname(filepath), 
     src = path.basename(filepath), 
     dest = cwd.replace('path/to/source', 'path/to/dest'); 
     value.src.push(path.join(dest, src.replace('coffee', 'js'))); 
    // clean only what has been removed 
     config = grunt.config('clean') || {}; 

    config.coffee = value; 

    grunt.config('clean', config); 

Zadanie refresh:coffee zostanie wywołany:

grunt.registerMultiTask('refresh', 'refreshing the changed file(s)', function() { 
     this.requires('regarde'); 

     var tasks = []; 
     var clean = grunt.config('clean'); 

     // check if there is clean:refresh config available 
     if (clean && clean[this.target]) { 
      tasks.push('clean:' + this.target); 
     } 
     var config = grunt.config(this.target); 

     // check if there is coffee:refresh config available 
     if (config && config.refresh) { 
      tasks.push(this.target + ':refresh'); 
     } 
     // run the tasks 
     grunt.task.run(tasks); 

     // set the resetFlag back to true 
     resetFlag = true; 
    }); 
0

grunt.regarde.changed to tablica jest poprawna?

Gdyby src: ['<%= grunt.regarde.changed %>']

być src: '<%= grunt.regarde.changed %>'

Przeglądałem źródła Grunt-contrib-kawy za drugą, aby zobaczyć, czy to może być nieprawidłowo obsługi cokolwiek dajesz go. Wygląda na to, że prawdopodobnie usztywniona tablica, którą ci dajesz, nie zostanie złapana i nie zostanie złapana.

myślę co jesteś przechodzącą przez przypadek może być: src: [ '[path1, path2, path3, etc]' ]

Jeśli jestem daleko podstawa, zostaw komentarz i będę usunąć tę odpowiedź.

+1

'src: '<% = grunt.regarde.changed%>' 'pracował dla mnie (musiał być zawinięty w ciąg). – Adam

+0

Dzięki, zmieniłem to wyżej. – nackjicholson

3

miałem tej kwestii się i udało mi się wymyślić rozwiązanie bo zainspirowany uwagami na ten temat: https://github.com/gruntjs/grunt-contrib-watch/issues/14

to jest rzeczywiście dla wtyczki grunt-contrib zegarka, ale powinno działa również dla chrząknięcia, ponieważ ma podobne zdarzenia.

Chodzi o to, aby powiązać wywołanie zwrotne z wydarzeniem watch, w którym dodaje się nowe zadanie do konfiguracji pomruków ze zmienioną ścieżką pliku, a następnie uruchom je.

z mojego Gruntfile.coffee:

coffee: 
    app: 
     expand: true 
     cwd: 'app/' 
     src: ['*.coffee',"**/*.coffee"] 
     dest: './public/temp' 
     ext: '.js' 
watch: 
    coffee: 
     files: ['app/**/*.coffee'] 
     tasks: ['livereload'] 
     options: 
      nospawn: true 

grunt.event.on 'watch', (action, filepath) ->  
    cwd = 'app/' 
    filepath = filepath.replace(cwd,'') 
    grunt.config.set('coffee', 
     changed: 
      expand: true 
      cwd: cwd 
      src: filepath 
      dest: './public/temp' 
      ext: '.js' 
    ) 
    grunt.task.run('coffee:changed') 

nospawn jest ważne dla zadania zegarka, więc uruchamia nowe zadanie przed zadaniem livereload. Jestem pewien, że respecte nie odradza domyślnie procesów potomnych.

Powiązane problemy