Gruntjs Grunt.js-同时运行两个监视任务?

Gruntjs Grunt.js-同时运行两个监视任务?,gruntjs,grunt-contrib-watch,Gruntjs,Grunt Contrib Watch,好的,我已经将Grunt设置为concat和min我所有的JS文件,我还将它设置为运行我的sass文件。这很好,我设置了watch调用来监视所有的.js和.scss文件,然后它运行为每个文件设置的任务 我在玩backbone.js,因此每次我对其中一个文件进行更改时都会联系很多库文件,这本身不是问题,但当任何sass文件更改时,它会同时运行我的闭包编译器,即使我的任何js文件都没有更改 所以我做了一些研究,从这里找到的一些问题/答案来看,我可以设置两个监视功能来监视不同的文件夹,并在每个监视文件

好的,我已经将Grunt设置为concat和min我所有的JS文件,我还将它设置为运行我的sass文件。这很好,我设置了watch调用来监视所有的.js和.scss文件,然后它运行为每个文件设置的任务

我在玩backbone.js,因此每次我对其中一个文件进行更改时都会联系很多库文件,这本身不是问题,但当任何sass文件更改时,它会同时运行我的闭包编译器,即使我的任何js文件都没有更改

所以我做了一些研究,从这里找到的一些问题/答案来看,我可以设置两个监视功能来监视不同的文件夹,并在每个监视文件夹上的文件发生更改时运行set任务。简单对吧?如果是这样,我不确定哪里出了问题,但它只会观看第一组任务,而第二组任务不会同时观看

我知道JavaScript是非阻塞的,但watch任务是一个阻塞任务,从我的理解来看(如果我错了,请纠正我),当我的第一个watch调用启动时,它阻止grunt运行第二个watch调用

然后我发现了concurrent,我认为它可以解决我的问题。但它只是做同样的事情,第一个监视调用似乎停止了第二个运行,而grunt正在监视我的第一组文件夹

以下是当前的grunt文件代码:

 module.exports = function(grunt) {

 // Project configuration.
 grunt.initConfig({
   pkg: grunt.file.readJSON('package.json'),

concurrent: {
    options: {
                logConcurrentOutput: true
            },
    target1: ['watch:ScssFiles'],
    target2: ['watch:JSFiles']
}, //End of Concurrent

'closure-compiler': {
    frontend: {
      closurePath: '/usr/lib',
      cwd: 'raw_assets/javascript/',
      js: ['jquery-2.1.0.js','underscore.js','backbone.js','vars.js','bb_models.js','bb_collections.js','bb_views.js','master.js'],
      jsOutputFile: 'assets/js/showcase_master.js',
      options: {
        compilation_level: 'SIMPLE_OPTIMIZATIONS',
        language_in: 'ECMASCRIPT5_STRICT',
      }//End of Options 
    } //End of frontend
}, //End of Closure Compiler

sass: {                             
    dist: {   
      options: {                    
        style: 'compressed'
      }, //End of Options
      files: {                        
        'assets/css/Master.css': 'raw_assets/sass/main.scss'    
      } //End of Files
    } //End of Dist.
}, //End of SASS

watch: {
  'JSFiles': {
    files: [ 'raw_assets/javascript/*.js' ],
    tasks: ['closure-compiler'],
    options: {
      spawn: false,
    },
  }, //End of Watch call for JS Files
 'ScssFiles': {
    files: ['raw_assets/sass/*.scss'],
    tasks: ['sass'],
    options: {
      spawn: false,
    }, 
  } //End of Watch SCSS Files
} //End of Watch


});

// Load the plugins
grunt.loadNpmTasks('grunt-closure-compiler');
grunt.loadNpmTasks('grunt-contrib-sass');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-concurrent');

//When 'Grunt' is run perform watch function
grunt.registerTask('default', ['concurrent:target2', 'concurrent:target1']);#

}; //End of GruntFile
所以我真正想要的是,这个grunt文件可以同时监视两个文件夹,并且只在该组中的文件发生更改时执行我需要的操作/任务,这可行吗

我确实有(或者至少我认为我有)一个解决办法,我在Windows上开发,但有一个运行Ubuntu服务器的虚拟机。我正在油灰终端中运行我的grunt文件。在这种情况下,我可以有两个putty终端,一个设置为一个监视js文件调用,另一个监视我的scss文件。这样的设置会更简单吗

欢迎大家帮忙

格伦


注:抱歉,如果我的拼写不正确,我有诵读困难,也可能没有正确解释,请告诉我,我会改进我的措辞,谢谢。

grunt concurrent
没有必要,
grunt contrib watch
可以按照您定义的方式查看多个目录。我删掉了你的文件来尝试一下,发现了两个问题

  • Grunt任务名称中似乎不允许使用连字符
  • 如果目录为空,grunt watch不会挂起。一旦有东西在里面,它就会暂停
  • 以下是简化版:

    module.exports = function(grunt) {
    
     // Project configuration.
     grunt.initConfig({
    
    watch: {
      'JSFiles': {
        files: [ 'raw_assets/javascript/*.js' ],
        tasks: ['closure_compiler'],
        options: {
          spawn: true,
        },
      }, //End of Watch call for JS Files
     'ScssFiles': {
        files: ['raw_assets/sass/*.scss'],
        tasks: ['sass'],
        options: {
          spawn: true,
        }, 
      } //End of Watch SCSS Files
    } //End of Watch
    
    
    });
    
    // Load the plugins
    grunt.loadNpmTasks('grunt-contrib-watch');
    
    //When 'Grunt' is run perform watch function
    grunt.registerTask('closure_compiler', function() {
       grunt.log.writeln("in closure_compiler");
    });
    
    grunt.registerTask('sass', function() {
       grunt.log.writeln("in sass");
    });
    
    }; //End of GruntFile
    
    然后我运行了
    npm install grunt grunt cli grunt contrib watch
    ,并用
    javascript
    sass
    子目录创建了
    raw\u assets
    目录。然后,我创建了一个空的JS文件和SCSS文件,并运行了
    GruntWatch

    两个子目录中的任何修改都会运行正确的任务

    $ grunt watch
    Running "watch" task
    Waiting...OK
    >> File "raw_assets/sass/foo2.scss" added.
    
    Running "sass" task
    in sass
    
    Done, without errors.
    Completed in 0.381s at Mon Mar 03 2014 00:21:46 GMT+0100 (CET) - Waiting...
    OK
    >> File "raw_assets/javascript/new.js" added.
    
    Running "closure_compiler" task
    in closure_compiler
    
    Done, without errors.
    Completed in 0.381s at Mon Mar 03 2014 00:27:50 GMT+0100 (CET) - Waiting...
    

    非常感谢,这似乎对我有用:)-我没怎么用咕噜。我一直认为你必须打电话询问你想要执行的操作。在这里,您只注册我要运行的两个任务。所以,当我使用JQuery/JavaScript(现在正在学习主干)时,使用JSHint或JsLint之类的东西不会成为问题吗?我是否将其注册为新任务?在它运行之前或之后运行我的关闭?再加上你推荐什么?因为他们看着我彼此非常接近?没问题。通常,您可以定义新任务,也可以使用插件中的任务。如果调用
    grunt.loadNpmTasks('grunt-contrib-jshint')
    您将加载
    jshint
    任务。要使用它,请将
    jshint
    部分添加到
    initConfig
    以配置任务,并将
    jshint
    添加到JS
    tasks
    数组中。我对jshint vs jslint不太熟悉,不知道该使用哪一种,我只是更经常地亲自遇到jshint。非常感谢-我也看到jshint比jslint多得多谢谢你,格伦。