每当运行Grunt时, 你可以为其指定一个或多个任务, 这些任务用于告诉Grunt你想要它做什么事情。

如果你没有指定一个任务,并且你已经定义一个名为 "default" 的任务,那么该任务将会默认被执行。

任务别名

如果指定了一个任务列表taskList,新任务名taskName将是这一个或多个指定任务的别名。当运行此 "任务别名" 时,在taskList 中指定的每个任务都会按照其出现的顺序依次执行。taskList参数必须是一个任务数组。grunt.registerTask(taskName, taskList)

举个例子:

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

上面的任务别名案例中定义了一个 'default' 任务,如果运行Grunt时没有指定任何任务,它将自动执行'jshint'、'qunit'、'concat' 和 'uglify' 任务。

还可以给任务指定参数。在下面的例子中,别名 "dist" 将执行 "concat" 和 "uglify" 两个任务,并且它们都带有一个 "dist" 参数:

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

多任务

当运行一个多任务时,Grunt会自动从项目的配置对象中查找同名属性。多任务可以有多个配置,并且可以使用任意命名的'targets'。举个例子:

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

如果通过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并不会检查配置和环境 -- 它仅仅执行指定的任务函数,并传递任何使用冒号分割的参数作为函数的参数。举个例子:

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

如果执行 grunt foo:testing:123,将输出日志 foo, testing 123。 如果执行这个任务时不传递参数,只是执行 grunt foo,那么将输出日志 foo, no args

自定义任务

如果你的任务没有遵循 "多任务" 结构,那就可以使用自定义任务。比如:

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

任务的其他特性

在一个任务内部,你可以执行其他的任务。比如:

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

任务也可以访问它们自身名称和参数。比如:

grunt.registerTask('foo', 'My "foo" task.', function(a, b) {grunt.log.writeln(this.name, a, b);
});// 用法:
// grunt foo
//   logs: "foo", undefined, undefined
// grunt foo:bar
//   logs: "foo", "bar", undefined
// grunt foo:bar:baz
//   logs: "foo", "bar", "baz"

如果任务在执行时记录到任何错误,那么任务就会失败。当任务失败时,所有的后续任务都将终止。比如:

grunt.registerTask('foo', 'My "foo" task.', function() {return false;
});grunt.registerTask('bar', 'My "bar" task.', function() {// 如果"foo"任务运行失败或者没有运行则任务失败。grunt.task.requires('foo');// 如果"foo"任务运行成功则执行这里的代码。grunt.log.writeln('Hello, world.');
});// 用法:
// grunt foo bar
//   没有输出,bar任务没有运行,因为"foo"失败,所以它后面的任务都将终止运行。
// grunt bar
//   没有输出,bar任务运行,但运动到一半就停止了,因为"foo"从未运行,所以foo任务失败,失败后,bar任务也就停止了,因此没有输出。

注意 grunt.task.requires 并不会真正的运行其他任务,它仅仅检查其它任务是否已经执行,并且没有失败。

任务还可以访问配置属性。比如:

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

如果任务需要的配置属性不存在,其也会失败。比如:

grunt.registerTask('foo', 'My "foo" task.', function() {// 如果缺少"meta.name"配置属性则任务失败。grunt.config.requires('meta.name');// 如果缺少"mata.name"配置属性则任务同样失败。grunt.config.requires(['meta', 'name']);// 根据情况记录日志。grunt.log.writeln('This will only log if meta.name is defined in the config.');
});

为什么我的异步task没有完成?
如果发生这种情况,可能是由于你忘记调用 this.async 方法来告诉Grunt你的任务是异步的。为了简单起见,Grunt使用同步的编码风格,可以在task体中通过调用 this.async() 将其转换为异步的。

注意,传递 false 给 done() 函数就会告诉Grunt你的任务已经失败。

例如:

grunt.registerTask('asyncme', 'My asynchronous task.', function() {var done = this.async();setTimeout(function() {     done(false);    //代表asyncme任务失败 }, 1000);
});

加油!

转载于:https://www.cnblogs.com/chaojidan/p/4239098.html

grunt入门讲解4:如何创建task(任务)相关推荐

  1. grunt入门讲解1:grunt的基本概念和使用

    Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. Grunt 0.4.x 必须配合Node.js >= 0.8.0版本使用.老版本的 Node. ...

  2. Grunt 入门指南3:创建Tasks

    创建tasks Tasks 是grunt最重要的组成部分.使用率最高,像 jshint 或 nodeunit. 每次Grunt执行,你可以告诉Grunt指定的一个或者多个tasks会运行. 如果你没有 ...

  3. 大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作...

    一 概述1.1 什么是搜索?1.2 如果用数据库做搜索会怎么样?1.3 什么是全文检索和 Lucene?1.4 什么是 Elasticsearch?1.5 Elasticsearch 的适用场景1.6 ...

  4. 转载:【opencv入门教程之六】创建Trackbar图片对比度、亮度值调整

    [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调整 浅墨_毛星云 2014-03-18 21:43:18 103746 收藏 21 最后发布:2014-03-18 ...

  5. FLASH脚本基础入门讲解1

    1.FLASH脚本基础入门讲解.按钮AS的编写.影片剪辑的AS编写 认识"动作"面板 在Flash中,动作脚本的编写,都是在"动作"面板的编辑环境中进行,熟悉& ...

  6. 动态规划27k字超详细保姆级入门讲解——附DP经典线性、区间、二维图、四维8个模型题解

    动态规划27k字超详细保姆级入门讲解 写在前面: 这篇文章是目前为止我写过最长也是最久的文章,前面关于DP的讲解我查阅了大量的博客资料,学习其他博主对DP的理解,也翻阅了很多经典的纸质书籍,同时做了近 ...

  7. 【直播】耿远昊:Pandas入门讲解(安泰第四届数据科学训练营)

    Pandas入门讲解 直播信息 主讲人:耿远昊,Datawhale成员,joyful-pandas作者. 直播时间:2021年04月07日 20:00~21:00 直播内容: 时间序列中的必知必会: ...

  8. Git高速入门——Git安装、创建版本号库以及经常使用命令

    Git高速入门--Git安装.创建版本号库以及经常使用命令 学习Git最全面的资料,在我看来是这本书-- Pro Git,网上关于Git的教程有非常多,包含当中一些非常优秀的教程.这一系列的博客,主要 ...

  9. 一看就明白的爬虫入门讲解:基础理论篇

    一看就明白的爬虫入门讲解:基础理论篇 发表于2015-11-13 18:50| 5909次阅读| 来源CSDN| 37 条评论| 作者孔淼 爬虫经验分享HTMLCSSAjaxApp网络 width=& ...

  10. 一看就明白的爬虫入门讲解-基础理论篇(下篇)

    文/孔淼 上篇我分享了爬虫入门中的"我们的目的是什么"."内容从何而来"."了解网络请求"这三部分的内容,这一篇我继续分享以下内容: 1) 一些常见的限制方式 2) 尝试解决问题的思路 3) 效率问题 ...

最新文章

  1. 贪心 ---- Codeforces Round #618 (Div. 2)B. Assigning to Classes+贪心[证明过程]
  2. Nginx 进阶 (ssl、fpm、rewrite、cache配置等)
  3. 使用visual studio code调试php代码
  4. define 双引号 其他宏_当年宏语言不受欢迎?背后的原因你知道吗?
  5. 科大奥锐思考题_科大奥锐光电效应测普朗克常数
  6. CNN-3: VGGNet 卷积神经网络模型
  7. 获取Spring容器管理的Bean工具类
  8. oracle监听为blocked,关于“Instance +ASM1, status BLOCKED, ”
  9. Mysql优化系列(1)--Innodb引擎下mysql自身配置优化
  10. android.appwidget-AppWidgetManager
  11. 答题小程序/刷题微信小程序/考试小程序2.0版本(新增代理,团购,题目导入,数据导出等功能,THINKPHP后台)
  12. 用Android studio搭建沃商店SDK任意支付的配置
  13. 使用H-lua框架制作魔兽争霸地图(8-物编-物品绑定技能篇1)
  14. RSF 分布式服务框架设计
  15. 基于PHP的大学生问卷调查系统
  16. c语言printf使用方法,C/C++语言printf命令使用方法
  17. CSS的一个小案例——模拟soso搜搜导航器
  18. 实施工程师mysql面试题_软件实施工程师面试题目
  19. ZSTU 4514: yesky wine锦鲤卡 (线性dp)
  20. 大数据24小时:Salesforce拟65亿美元收购Mulesoft,林志颖加盟小黑鱼科技任首席体验官

热门文章

  1. leetcode刷题日记-喧闹和富有
  2. 用python爬取中南大学所有教师个人主页的个人简介
  3. 大龄程序员失业后,看他们是如何破局突围的?
  4. 知识星球限时优惠活动,速进!
  5. Android Multimedia框架总结(二)MediaPlayer框架及播放网络视频案例
  6. java 象棋 人工智能_【揭秘】人工智能大热,缘何不敢挑战中国象棋?
  7. arcgis中dem坐标定义_ArcGIS中的地理坐标系转换方法参数(二) | 学步园
  8. python语言中的模块包括_python中常用的模块的总结
  9. 判断整数_2021暑期强化不定方程整数解问题
  10. python 图表工具_7 款 Python 数据图表工具的比较