44 votes

Comment regardez-vous plusieurs fichiers, mais n'exécutez-vous la tâche que sur le fichier modifié, dans Grunt.js?

En apprenant à utiliser grunt, je suis en train de faire un simple café-script watcher/compilateur. Le problème est que si je dis à l' watch tâche de regarder plusieurs fichiers, et on change, il va passer tous les fichiers à l' coffee commande. Cela signifie que lorsque vous modifiez 1 fichier, il va recompiler tous les fichiers correspondant à l' src modèle. Au lieu de cela, je veux seulement recompiler le seul fichier qui a changé, qui correspond à l' src modèle.

Voici l' 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');
};

C'est à l'aide de grunt-café, qui est essentiellement ceci: https://gist.github.com/2373159.

Lorsque j'exécute grunt watch, et j'ai enregistrer un fichier dans test/cases/controller/*.coffee, il compile tous les fichiers correspondants (en les mettant en tmp/*).

Comment avez-vous, au lieu seulement de compiler le changé fichier à l'aide de grunt?

15voto

Cowboy Ben Alman Points 1211

La prochaine (et actuellement en cours de développement) v0.4.0 un grognement a la grognement.fichier.watchFiles objet, qui a été conçu spécialement à cet effet. Le grunt-café plugin peut avoir ajouté le support de cette fonctionnalité déjà, je ne suis pas sûr.

De toute façon, si vous êtes intéressé à essayer une version de développement de grognement dans votre projet, consultez le Quand vais-je être en mesure d'utiliser dans le développement de la fonctionnalité "X"? Entrée de la FAQ.

8voto

blachniet Points 854

J'ai eu ce travail lors de la compilation de mes fichiers moins. Vous devriez être capable de jouer avec cette configuration un peu pour le faire fonctionner avec le plugin Coffeescript. La partie de l'intérêt est le grunt.event.on('watch', ...) . Dans ce gestionnaire d'événements, je mets à jour la propriété files dans la commande less pour ne contenir que le fichier modifié.

 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']);
};
 

4voto

Ryan Smith Points 356

Aucune de ces réponses n'a très bien fonctionné pour moi. Voici ma solution si quelqu'un est intéressé (je sais que je suis un peu en retard pour répondre à cette question).

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

3voto

luissquall Points 633

Dans cette question, Kyle Robinson suggère d'utiliser l' watchévénement. Il est très important de régler la montre tâche nospawn de la propriété d' true à le faire fonctionner. J'ai modifié sa solution de manière sélective, exécutez les tâches:

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]);
    }
});

Voici la solution: https://gist.github.com/luissquall/5408257

2voto

Michael Points 1418

Donc, la nouveauté de Grunt 0.4 est plus de tâches nommées

Laissez-nous vous donner un exemple!

 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']
    },
}
 

Pour exécuter toutes ces tâches de surveillance, il suffit de faire grunt.registerTask ('default', ['myInitialBuild', 'watch']);

myInitialBuild est la construction initiale (tous les fichiers), suivi d'une surveillance de chaque paquet. En réalité, vous pouvez le faire pour tous les fichiers, mais cela peut paraître nul

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X