grunt 創(chuàng)建任務

任務是Grunt的面包和奶油考蕾。就像你常用的工具祸憋,如: jshintnodeunit。每當運行Grunt時, 你可以為其指定一個或多個任務, 這些任務用于告訴Grunt你想要它做什么事情肖卧。

如果你沒有指定一個任務蚯窥,并且你已經(jīng)定義一個名為 "default" 的任務,那么該任務將會默認被執(zhí)行(不用詫異塞帐,總要做點兒什么袄乖!)葵姥。

任務別名

如果指定了一個任務列表荷鼠,新任務將是這一個或多個指定任務的別名。當運行此 "任務別名" 時榔幸,在 taskList 中指定的每個任務都會按照其出現(xiàn)的順序依次執(zhí)行允乐。taskList參數(shù)必須時一個任務數(shù)組。

grunt.registerTask(taskName, [description, ] taskList)

下面的任務別名案例中定義了一個 'default' 任務削咆,如果運行Grunt時沒有指定任何任務牍疏,它將自動執(zhí)行'jshint'、'qunit'拨齐、'concat' 和 'uglify' 任務鳞陨。

grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']);

還可以給任務指定參數(shù)。在下面的案例中奏黑,別名 "dist" 將執(zhí)行 "concat" 和 "uglify" 兩個任務炊邦,并且它們都帶有一個 "dist" 參數(shù):

grunt.registerTask('dist', ['concat:dist', 'uglify:dist']);

多任務

當運行一個多任務時,Grunt會自動從項目的配置對象中查找同名屬性熟史。多任務可以有多個配置馁害,并且可以使用任意命名的'targets'。

同時指定像grunt concat:foo或者grunt concat:bar這樣的任務和目標蹂匹,在運行時Grunt只會處理指定目標的配置碘菜;然而如果運行grunt concat,將會遍歷所有的目標, 并按任務指定的順序處理每個目標。注意忍啸,如果一個任務已經(jīng)使用grunt.task.renameTask重命名過仰坦,Grunt將會自動在配置對象中查找新任務名稱屬性。

大部分的contrib任務(主要是指官方提供的任務)计雌,包括grunt-contrib-jshint插件的jshint任務悄晃,以及grunt-contrib-concat插件的concat任務都是多任務形式的。

grunt.registerMultiTask(taskName, [description, ] taskFunction)

對于指定的配置凿滤,這里有一個案例演示了如果通過grunt log:foo運行Grunt妈橄,它會輸出foo: 1,2,3;如果通過grunt log:bar來運行Grunt翁脆, 它會輸出bar: hello world眷蚓。然而如果通過grunt log運行Grunt, 它會輸出foo: 1,2,3,然后是bar: hello world反番,最后是baz: false(任務目標會按照指定的順序進行處理)沙热。

grunt.initConfig({
  log: {
    foo: [1, 2, 3],
    bar: 'hello world',
    baz: false
  }
});

grunt.registerMultiTask('log', 'Log stuff.', function() {
  grunt.log.writeln(this.target + ': ' + this.data);
});

"基本" 任務

當一個基本任務執(zhí)行時,Grunt并不會檢查配置和環(huán)境 -- 它僅僅執(zhí)行指定的任務函數(shù)罢缸,并傳遞任何使用冒號分割的參數(shù)作為函數(shù)的參數(shù)

grunt.registerTask(taskName, [description, ] taskFunction)

下面的案例中篙贸,如果執(zhí)行grunt foo:testing:123,將輸出日志foo, testing 123祖能。 如果執(zhí)行這個任務時不傳遞參數(shù)歉秫,只是執(zhí)行 grunt foo,那么將輸出日志foo, no args养铸。

grunt.registerTask('foo', 'A sample task that logs stuff.', function(arg1, arg2) {
  if (arguments.length === 0) {
    grunt.log.writeln(this.name + ", no args");
  } else {
    grunt.log.writeln(this.name + ", " + arg1 + " " + arg2);
  }
});

自定義任務

你可以和任務一起瘋狂雁芙。如果你的任務并沒有遵循 "多任務" 結(jié)構(gòu),那就使用自定義任務钞螟。

grunt.registerTask('default', 'My "default" task description.', function() {
  grunt.log.writeln('Currently running the "default" task.');
});

在一個任務內(nèi)部兔甘,你可以執(zhí)行其他的任務。

grunt.registerTask('foo', 'My "foo" task.', function() {
  // Enqueue "bar" and "baz" tasks, to run after "foo" finishes, in-order.
  grunt.task.run('bar', 'baz');
  // Or:
  grunt.task.run(['bar', 'baz']);
});

任務也可以是異步的鳞滨。

grunt.registerTask('asyncfoo', 'My "asyncfoo" task.', function() {
  // Force task into async mode and grab a handle to the "done" function.
  var done = this.async();
  // Run some sync stuff.
  grunt.log.writeln('Processing task...');
  // And some async stuff.
  setTimeout(function() {
    grunt.log.writeln('All done!');
    done();
  }, 1000);
});

任務也可以訪問它們自身名稱和參數(shù)洞焙。

grunt.registerTask('foo', 'My "foo" task.', function(a, b) {
  grunt.log.writeln(this.name, a, b);
});

// 用法:
// grunt foo foo:bar
//   logs: "foo", undefined, undefined
//   logs: "foo", "bar", undefined
// grunt foo:bar:baz
//   logs: "foo", "bar", "baz"

如果記錄到任何錯誤,那么任務就會失敗拯啦。

grunt.registerTask('foo', 'My "foo" task.', function() {
  if (failureOfSomeKind) {
    grunt.log.error('This is an error message.');
  }

  // 如果這個任務出現(xiàn)錯誤則返回false
  if (ifErrors) { return false; }

  grunt.log.writeln('This is the success message');
});

當任務失敗時澡匪,所有后續(xù)任務都將終止,除非指定--force 褒链。

grunt.registerTask('foo', 'My "foo" task.', function() {
  // Fail synchronously.
  return false;
});

grunt.registerTask('bar', 'My "bar" task.', function() {
  var done = this.async();
  setTimeout(function() {
    // Fail asynchronously.
    done(false);
  }, 1000);
});

任務還可以依賴于其他任務的成功執(zhí)行唁情。注意grunt.task.requires 并不會真正的運行其他任務,它僅僅檢查其它任務是否已經(jīng)執(zhí)行甫匹,并且沒有失敗甸鸟。

grunt.registerTask('foo', 'My "foo" task.', function() {
  return false;
});

grunt.registerTask('bar', 'My "bar" task.', function() {
  // 如果"foo"任務運行失敗或者沒有運行則任務失敗惦费。
  grunt.task.requires('foo');
  // 如果"foo"任務運行成功則執(zhí)行這里的代碼。
  grunt.log.writeln('Hello, world.');
});

// 用法:
// grunt foo bar
//   沒有輸出抢韭,因為"foo"失敗薪贫。
// grunt bar
//   沒有輸出,因為"foo"從未運行刻恭。

如果任務需要的配置屬性不存在瞧省,其也可能失敗。

grunt.registerTask('foo', 'My "foo" task.', function() {
  // Fail task if "meta.name" config prop is missing
  // Format 1: String 
  grunt.config.requires('meta.name');
  // or Format 2: Array
  grunt.config.requires(['meta', 'name']);
  // Log... conditionally.
  grunt.log.writeln('This will only log if meta.name is defined in the config.');
});

任務還可以訪問配置屬性鳍贾。

grunt.registerTask('foo', 'My "foo" task.', function() {
  // 記錄屬性值臀突,如果屬性未定義(undefined)則返回null。
  grunt.log.writeln('The meta.name property is: ' + grunt.config('meta.name'));
  // 同樣的記錄屬性值贾漏,如果屬性未定義(undefined)則返回null。
  grunt.log.writeln('The meta.name property is: ' + grunt.config(['meta', 'name']));
});

contrib tasks 中可以查看更多案例藕筋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纵散,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子隐圾,更是在濱河造成了極大的恐慌伍掀,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暇藏,死亡現(xiàn)場離奇詭異蜜笤,居然都是意外死亡,警方通過查閱死者的電腦和手機盐碱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門把兔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓮顽,你說我怎么就攤上這事县好。” “怎么了暖混?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵缕贡,是天一觀的道長。 經(jīng)常有香客問我拣播,道長晾咪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任贮配,我火速辦了婚禮谍倦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牧嫉。我一直安慰自己剂跟,他們只是感情好减途,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布嚷狞。 她就那樣靜靜地躺著矩乐,像睡著了一般杉适。 火紅的嫁衣襯著肌膚如雪洒忧。 梳的紋絲不亂的頭發(fā)上乓诽,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天辫红,我揣著相機與錄音辐益,去河邊找鬼咆贬。 笑死偷崩,一個胖子當著我的面吹牛辟拷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阐斜,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼衫冻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谒出?” 一聲冷哼從身側(cè)響起隅俘,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笤喳,沒想到半個月后为居,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡杀狡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年蒙畴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呜象。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡膳凝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出董朝,到底是詐尸還是另有隱情鸠项,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布子姜,位于F島的核電站祟绊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哥捕。R本人自食惡果不足惜牧抽,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望遥赚。 院中可真熱鬧扬舒,春花似錦、人聲如沸凫佛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晨炕,卻和暖如春衫画,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓮栗。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工削罩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人费奸。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓弥激,卻偏偏與公主長得像,于是被迫代替她去往敵國和親愿阐。 傳聞我的和親對象是個殘疾皇子微服,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)缨历,斷路器职辨,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • Grunt配置 Grunt的task配置都是在 Gruntfile 中的grunt.initConfig方法中指定...
    慢狍子閱讀 536評論 0 1
  • grunt配置 Grunt的task配置都是在 Gruntfile 中的grunt.initConfig方法中指定...
    angelwgh閱讀 320評論 0 0
  • 對網(wǎng)站資源進行優(yōu)化,并使用不同瀏覽器測試并不是網(wǎng)站設(shè)計過程中最有意思的部分戈二,但是這個過程中的很多重復的任務能夠使用...
    懵逼js閱讀 1,067評論 0 8
  • 這是在測試情況下,一般權(quán)威的HTTPS 移動端是不許呀做處理的
    健健鍋閱讀 1,410評論 0 1