在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 物聯(lián)網(wǎng)/ 創(chuàng)建任務(wù)
深入任務(wù)內(nèi)幕
grunt.option
退出碼
創(chuàng)建插件
grunt.file
grunt
快速入門(mén)
項(xiàng)目腳手架
使用命令行工具
Gruntfile 實(shí)例
配置任務(wù)
創(chuàng)建任務(wù)
grunt.log
安裝Grunt
grunt.util
grunt.event
常見(jiàn)問(wèn)題
grunt.config
grunt.task
grunt.template
grunt.fail

創(chuàng)建任務(wù)

任務(wù)是Grunt的基本組成。例如你常用的工具:jshintnodeunit。當(dāng)你每次運(yùn)行Grunt時(shí),你可以指定它(Grunt)運(yùn)行一個(gè)或者多個(gè)任務(wù),通過(guò)這些任務(wù)來(lái)告訴Grunt你想要它做什么事情。

如果你沒(méi)有指定任務(wù),但是定義了一個(gè)名為"default"的任務(wù),那么該任務(wù)(default任務(wù))將默認(rèn)運(yùn)行(不要驚訝,顧名思義它代表默認(rèn)會(huì)運(yùn)行哪些定義好的任務(wù))。

別名任務(wù)

如果指定了一個(gè)任務(wù)列表,新任務(wù)(名)便是其他一個(gè)或多個(gè)任務(wù)的別名。每當(dāng)運(yùn)行'別名任務(wù)'時(shí),指定在taskList中的每個(gè)任務(wù)(指在grunt.initConfig()中定義的任務(wù))都會(huì)按照指定它們的順序運(yùn)行。taskList參數(shù)必須是一個(gè)任務(wù)數(shù)組。其語(yǔ)法如下:

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

這里有一個(gè)例子,它定義了一個(gè)名為'default'別名任務(wù),如果運(yùn)行Grunt時(shí)沒(méi)有指定任何任務(wù),它將自動(dòng)運(yùn)行'jshint','qunit','concat'和'uglify'任務(wù)。

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

可以給任務(wù)指定參數(shù)。在下面的例子中,別名任務(wù)'dist'會(huì)運(yùn)行'concat'和'uglify'這兩個(gè)任務(wù),并且每個(gè)任務(wù)都帶有一個(gè)'dist'參數(shù):

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

多任務(wù)

當(dāng)運(yùn)行一個(gè)多任務(wù)時(shí),Grunt會(huì)自動(dòng)從項(xiàng)目的配置對(duì)象中查找同名屬性。多任務(wù)可以有多個(gè)配置,并且可以使用任意命名的'targets'。

同時(shí)指定像grunt concat:foo或者grunt concat:bar這樣的任務(wù)和目標(biāo),在運(yùn)行時(shí)Grunt只會(huì)處理指定目標(biāo)的配置;然而如果運(yùn)行grunt concat,將會(huì)遍歷所有的目標(biāo), 并按任務(wù)指定的順序處理每個(gè)目標(biāo)。注意,如果一個(gè)任務(wù)已經(jīng)使用grunt.renameTask重命名過(guò),Grunt將會(huì)自動(dòng)在配置對(duì)象中查找新任務(wù)名稱(chēng)屬性。

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

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

鑒于指定的配置,這里有一個(gè)示例演示了如果通過(guò)grunt log:foo運(yùn)行Grunt,它會(huì)輸出foo: 1,2,3;如果通過(guò)grunt log:bar來(lái)運(yùn)行Grunt, 它會(huì)輸出bar: hello world。然而如果通過(guò)grunt log運(yùn)行Grunt, 它會(huì)輸出foo: 1,2,3,然后是bar: hello world,最后是baz: false(任務(wù)目標(biāo)會(huì)按照指定的順序進(jìn)行處理)。

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

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

'基本'任務(wù)

當(dāng)運(yùn)行一個(gè)基本任務(wù)時(shí),Grunt并不會(huì)查找配置和檢查運(yùn)行環(huán)境--它僅僅運(yùn)行指定的任務(wù)函數(shù),可以傳遞任意使用冒號(hào)分割的參數(shù)作為任務(wù)函數(shù)的參數(shù)(注意多任務(wù)中的冒號(hào)并不是傳遞參數(shù),而是指定具體任務(wù)的目標(biāo))。

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

這里有一個(gè)例子演示了如果通過(guò)grunt foo:testing:123運(yùn)行Grunt將輸出foo, testing 123。如果運(yùn)行這個(gè)任務(wù)時(shí)不傳遞參數(shù),只運(yùn)行grunt foo,那么這個(gè)任務(wù)會(huì)輸出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);
    }
});

自定義任務(wù)

你可能會(huì)著迷于任務(wù)。但是如果你的任務(wù)并沒(méi)有遵循多任務(wù)結(jié)構(gòu),那么你可以使用自定義任務(wù)。

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

在任務(wù)的內(nèi)部,你還可以運(yùn)行其他的任務(wù)。

grunt.registerTask('foo', 'My "foo" task.', function() {
    //在foo任務(wù)完成之后一次運(yùn)行隊(duì)列中的bar和baz任務(wù)
    grunt.task.run('bar', 'baz');
    // Or:
    grunt.task.run(['bar', 'baz']);
});

任務(wù)還可以是異步的.

grunt.registerTask('asyncfoo', 'My "asyncfoo" task.', function() {
    //將任務(wù)轉(zhuǎn)變?yōu)楫惒侥J讲⒔唤odone函數(shù)處理
    var done = this.async();
    //同步任務(wù)
    grunt.log.writeln('Processing task...');
    //異步任務(wù)
    setTimeout(function() {
        grunt.log.writeln('All done!');
        done();
    }, 1000);
});

任務(wù)也可以訪問(wèn)它們自身名稱(chēng)和參數(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"

如果任務(wù)記錄到錯(cuò)誤信息,還可以終止任務(wù)執(zhí)行(通過(guò)標(biāo)記任務(wù)失敗的方式)。

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

    //如果這個(gè)任務(wù)拋出錯(cuò)誤則返回false
    if (ifErrors) { return false; }

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

當(dāng)任務(wù)失敗時(shí),所有后續(xù)的除了指定--force標(biāo)志的任務(wù)都會(huì)終止。

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);
});

任務(wù)還可以依賴(lài)于其他任務(wù)的成功執(zhí)行。注意grunt.task.requires并不會(huì)運(yùn)行其他任務(wù)(比如參數(shù)中指定的任務(wù))。它僅僅檢查那些任務(wù)(其他任務(wù))的運(yùn)行并沒(méi)有失敗(即其他任務(wù),也就是所依賴(lài)的任務(wù)是否失敗)。

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

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

// 用法
// grunt foo bar
// 沒(méi)有輸出,因?yàn)閒oo失敗
// grunt bar
// 沒(méi)有輸出,因?yàn)閒oo從未運(yùn)行

如果任務(wù)需要的配置屬性不存在,任務(wù)也可能失敗。

grunt.registerTask('foo', 'My "foo" task', function(){
    //如果缺省"meta.name"配置屬性則任務(wù)失敗
    grunt.config.requires('meta.name');
    //與上一句相同,如果缺省"meta.name"配置屬性則任務(wù)失敗
    grunt.config.requires(['meta', 'name']);
    //附加記錄
    grunt.log.writeln('This will only log if meta.name is defined in the config');
});

任務(wù)還可以訪問(wèn)配置屬性。

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

contrib tasks中可以查看更多的例子。

CLI選項(xiàng)和環(huán)境

TODO(從FAQ拉取,推薦process.env)

為什么我的異步任務(wù)沒(méi)有完成?

可能由于你忘記調(diào)用this.async方法來(lái)告訴Grunt你的任務(wù)是異步的,那么就可能會(huì)發(fā)生這種情況(異步任務(wù)失敗)。為了簡(jiǎn)單起見(jiàn),Grunt使用同步的編碼風(fēng)格,可以在任務(wù)體中通過(guò)調(diào)用this.async將該任務(wù)(調(diào)用這個(gè)方法的任務(wù))轉(zhuǎn)換為異步的。

注意傳遞falsedone函數(shù)就會(huì)告訴Grunt任務(wù)已經(jīng)失敗。

例如:

grunt.registerTask('asyncme', 'My asynchronous task.', function(){
    var done = this.async();
    doSomethingAsync(done);
}); 
上一篇:項(xiàng)目腳手架下一篇:安裝Grunt