различные задачи ворчания и инициирующие события

Я пытаюсь использовать две задачи просмотра: одну для html и css, которая (должна) просто запускать перезагрузку (чего тоже не происходит), а другую — для файлов .js. Затем я пытаюсь просто удалить измененный файл, а затем объединить все файлы js. Не работает, все время все js файлы углючат, какой бы файл не менялся. Будучи новичком в Grunt, может кто-нибудь уделить минутку или две?

module.exports = function(grunt) {

  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    concat: {
      options: {
        separator: ';'
      },
      files: {
        src: ['js/minified/jquery.min.js',
          'js/minified/jquery-migrate.min.js',
          'js/minified/jquery-ui-1.10.3.custom.min.js',
          'js/minified/jquery.imagesloaded.min.js',
          'js/minified/video.js',
          'js/minified/bigvideo.js',
          'js/minified/jquery.cycle.all.js',
          'js/minified/jquery.maximage.js',
          'js/minified/jquery.jfeed.js',
          'js/minified/moment.min.js',
          'js/minified/fastclick.js',
          'js/minified/cookies.min.js',
          'js/minified/jquery.hammer.min.js',
          'js/minified/index.js'
        ],
        dest: '<%= pkg.name %>.js'
      },
    },
    uglify: {
      files: {
        src: 'js/*.js', // source files mask
        dest: 'js/minified', // destination folder
        expand: true, // allow dynamic building
        flatten: true, // remove all unnecessary nesting
      }
    },
    jshint: {
      files: ['gruntfile.js', 'js/index.js'],
      options: {
        // options here to override JSHint defaults
        globals: {
          jQuery: true,
          console: true,
          module: true,
          document: true
        }
      }
    },
    watch: {
      options: {
        livereload: true
      },
      javascript: {
        files: ['js/*.js', 'gruntfile.js'],
        tasks: ['watchtask'],
        options: {
          nospawn: true,
        }
      },
      therest: {
        files: ['index.html', 'css/*.css'],
        tasks: []
      }
    },
    open: {
      dev: {
        path: 'http://127.0.0.1:8000'
      },
    },
    connect: {
      server: {
        options: {
          hostname: '*',
          port: 8000
        }
      }
    }
  });

  grunt.event.on('watch', function(action, filepath) {
    //change the source in the uglify task at run time so that it affects the changed file only
    grunt.config(['uglify', 'files', 'src'], filepath);
  });

  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-jshint');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-concat');
  grunt.loadNpmTasks('grunt-contrib-connect');
  grunt.loadNpmTasks('grunt-open');

  grunt.registerTask('default', ['jshint', 'uglify', 'concat', 'connect', 'open', 'watch']);
  grunt.registerTask('watchtask', ['jshint', 'uglify', 'concat']);

};

person wackazong    schedule 11.09.2013    source источник
comment
Я получаю следующую ошибку: Running "watch" task Waiting...2013-09-11 22:25 node[10342] (CarbonCore.framework) FSEventStreamFlushSync(): failed assertion '(SInt64)last_id > 0LL'   -  person wackazong    schedule 12.09.2013
comment
Mac OS 10.8.4, узел 0.10.18, ворчание 0.4.1   -  person wackazong    schedule 12.09.2013


Ответы (1)


Это ожидаемое поведение. При изменении любого файла в списке файлов задач watch:javascript выполняются связанные задачи. Ваш watchtask запускает uglify, который искажает весь код JS. Вам нужно будет указать отдельные цели просмотра для разных файлов JS и отдельные цели uglify, чтобы делать то, что вы предлагаете.

Например:

...
  uglify: {
    someTarget: {
      files: {
        src: 'js/file1.js', // source files mask
        dest: 'js/minified', // destination folder
        expand: true, // allow dynamic building
        flatten: true, // remove all unnecessary nesting
      }
    },
    otherTarget: {
      files: {
        src: 'js/file2.js', // source files mask
        dest: 'js/minified', // destination folder
        expand: true, // allow dynamic building
        flatten: true, // remove all unnecessary nesting
      }
    }
  },
  ...
  watch: {
    options: {
      livereload: true
    },
    javascriptOne: {
  files: ['js/file1.js'],
      tasks: ['uglify:someTarget'],
      options: {
        nospawn: true,
      }
    },
    javascriptTwo: {
      files: ['js/file2.js'],
      tasks: ['uglify:otherTarget'],
      options: {
        nospawn: true,
      }
    },
    ...
  },
...
person Jordan Kasper    schedule 14.09.2013
comment
Тогда я действительно не понимаю, в чем проблема с моей настройкой. Разве нельзя просмотреть некоторые файлы и запустить задачу по искажению некоторых других файлов? - person wackazong; 24.09.2013
comment
Что-то вроде... задача наблюдения говорит, что при изменении одного из этих совпадающих файлов выполнить эту задачу. Итак, для вас говорится, что когда любой файл в папке js с расширением .js изменяется, запустите watchtask, который, в свою очередь, запускает uglify и concat, что, как я предполагаю, искажает и объединяет все JS файлы. Если вы хотите исказить только файл X при его изменении, вам придется наблюдать за ним в одиночку, а затем запускать задачу, которая искажает только этот файл. - person Jordan Kasper; 24.09.2013
comment
Конечно, вы всегда можете попробовать написать плагин, который сделает то, о чем вы просите, возможно, это даже не так сложно. ;) - person Jordan Kasper; 24.09.2013