2014-03-02 27 views
1

好的,我已经安装了Grunt来连接并分割所有的JS文件,我也已经设置它来运行我的sass文件。这工作正常,我建立了观看电话来观看所有.js和.scss文件,然后运行设置给每个任务的任务。Grunt.js - 同时运行两个手表任务吗?

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

所以我做了一些研究,并从这里发现了一些问题/答案,它看起来像我可以设置两个监控功能来观看不同的文件夹,然后运行设置任务时,这些文件改变了每个监视的文件夹。简单的权利?如果是这样,我不确定哪里出了问题,但它只会看第一套任务,第二套它不会同时看?

我知道JavaScript是非阻塞的,但手表任务是一项阻塞任务,根据我的理解(如果我错了,请纠正我),当我的第一个手表通话开始时,它会停止运行第二次看电话?

然后我发现了同时,我认为会解决我的问题。但它只是做同样的事情,第一次看到的电话似乎是第二次停止运行,而咕噜声正在观看我的第一组文件夹。

这是当前咕噜文件代码:

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 

所以我真正想要的,这是咕噜文件在同一时间观看这两个文件夹,只瓶坯的动作/任务,我需要的是,当文件组改变了,这是可行的吗?

我有(或在免得以为我是)有周围的工作,我在Windows上开发,但在运行Ubuntu的服务器的虚拟机。我在腻子终端内运行我的咕噜声文件。在这种情况下,我可以有两个腻子终端,一个用于观看js文件,另一个用于观看我的scss文件。这种设置会是更简单的方法吗?

所有帮助最受欢迎。

Glenn。

PS。对不起,如果我的拼写关闭,我是阅读障碍,也可能没有解释正确的东西,所以让我知道,我会改善我的措辞,谢谢。

回答

1

grunt-concurrent没有必要,grunt-contrib-watch可以按照您定义的方式观看多个目录。我烧了你的文件来试试看,并抓到两个问题

  1. 连字符似乎不被允许在一个Grunt任务名称。
  2. 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,并与javascriptsass子目录创建raw_assets目录。然后我创建了一个空的JS文件和SCSS文件,并运行grunt watch

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

$ 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... 
+0

非常感谢,这似乎为我工作:) - 我没有使用过多的Grunt。我一直认为你必须在你想要执行的动作上调用registerTask。在这里你只注册我想运行的两个任务。那么,因为我正在使用JQuery/JavaScript(现在学习Backbone),所以使用类似JSHint或JsLint的东西不会是一个问题?我是否将其注册为新任务?在运行我的关闭之前或之后运行?另外你会推荐什么?当他们看着我非常接近彼此? –

+1

没问题。一般来说,您可以定义一个新任务或使用一个插件。如果你调用'grunt.loadNpmTasks('grunt-contrib-jshint');'你会加载'jshint'任务。要使用它,在'initConfig'中添加'jshint'部分来配置任务,并将'jshint'添加到JS'tasks'数组中。我对jshint vs jslint不太熟悉,建议使用哪个,我个人经常碰到jshint。 –

+0

非常感谢 - 我还看到JShint比jslint多得多。 - 谢谢格伦。 –