Question

J'exécute une tâche de grognement qui utilise simultanément pour exécuter Nodemon et Watch / Liveleload. Sur la charge par défaut, je peluche et lance simultanément. Je voudrais également configurer une montre pour pelucher les fichiers individuels en modification. Actuellement, tous les fichiers sont liés lorsqu'un fichier est modifié.

J'ai examiné une question similaire sur Stackoverflow et j'ai décidé d'aller avec Grunt-Newer comme solution potentielle. Dans mon implémentation ci-dessous, cependant, le préfixe «plus récent» ne semble rien faire. Comment puis-je résoudre ce problème pour que seuls les fichiers modifiés soient pendés?

module.exports = function(grunt) {
  //load all dependencies
  require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);

  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    concurrent: {
      dev: {
        options: {
          logConcurrentOutput: true
        },
        tasks: ['watch', 'nodemon']
      }
    },
    jshint: {
      files: ['Gruntfile.js', 'client/src/*.js', 'server/**/*.js'],
      options: {
        '-W030': true,
        '-W083': true,
        globals: {
          console: true,
          module: true,
          document: true
        }
      }
    },
    watch: {
      all: {
        files: ['<%= jshint.files %>'],
        tasks: ['newer:jshint']
      },
      frontend: {
        files: ['client/**/*.{css,js,html}'],
        options: {
          livereload: true
        }
      }
    },
    nodemon: {
      dev: {
        options: {
          file: 'server/server.js',
          watchedFolders: ['server']
        }
      }
    }
  });

  grunt.registerTask('test', ['jshint']);
  grunt.registerTask('default', ['jshint', 'concurrent']);

};
Était-ce utile?

La solution

J'avais le même problème et je l'ai finalement compris. La solution est cachée profondément dans la documentation et très trompeuse avec le spawn Option dans l'échantillon de code: https://github.com/gruntjs/grunt-contrib-watch#compiling-iles-as-seeded

Votre fichier de configuration doit rester le même que vous l'avez dans votre question, mais vous devez ajouter un auditeur à l'événement Watch. Je recommande l'option «robuste» qu'ils fournissent (modifiée pour votre configuration de tâche spécifique). Placez ce code juste au-dessus de l'appel à grunt.initConfig Et après toi require appels.

var changedFiles = Object.create(null);
var onChange = grunt.util._.debounce(function() {
  // Modified to point to jshint.files as per the task example in the question.
  grunt.config('jshint.files', Object.keys(changedFiles));
  changedFiles = Object.create(null);
}, 200);

grunt.event.on('watch', function(action, filepath) {
  changedFiles[filepath] = action;
  onChange();
});

Ajouter le nospawn option au all regarder la tâche. C'est ce qui est trompeur dans la documentation. Il mentionne qu'il doit être désactivé si vous souhaitez modifier dynamiquement votre configuration, mais l'empêche essentiellement de travailler avec plus récemment à moins qu'il ne soit défini sur true:

 watch: {
   all: {
     files: ['<%= jshint.files %>'],
     tasks: ['newer:jshint'],
     options: {
       nospawn: true,
     }
   },
   ...

Remarque: Si vous modifiez votre fichier grogn pendant qu'il s'exécute, il mettra à peluchez tous les fichiers, je ne sais pas pourquoi cela fait cela, mais il est ensuite coincé et continuera de tout lier pour toutes les modifications que vous apportez. Je viens de retirer le «gruntfile.js» de la liste des fichiers qui devraient être minces pour l'éviter.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top