2014-03-02 43 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多得多。 - 謝謝格倫。 –