由于将来工作需要最近学习了Grunt,至于Grunt是什么大家百度下就好了,我就不多说了。对于它内部的实现比较感兴趣,所以看了看源码。今天先来说说grunt命令行工具grunt-cli的实现。

grunt-cli是建立在grunt基础上的命令行工具,通过它可以很方便的使用grunt进行一些自动化任务。grunt-cli的处理过程主要分为下面几步:

  1. 加载必须的模块,这其中包括第三方模块和grunt-cli内部的模块

  2. 获取命令行参数执行相应的操作

  3. 查找grunt.js文件并执行任务

下面的grunt-cli的主要代码:

#!/usr/bin/env node'use strict';process.title = 'grunt';//加载文件查找模块,findup用于向上查找
var findup = require('findup-sync');
//加载路径解析模块
var resolve = require('resolve').sync;//加载grunt-cli内部的cli模块
//cli模块利用nopt第三方库来获取grunt命令中的参数值
var options = require('../lib/cli').options;//加载grunt-cli内部的completion模块
//completion模块用来打印自动补全的脚本
//这样就可以通过eval "$(grunt --completion=bash)"来执行脚本支持自动补全
//completion.js内部就是通过参数查找文件最后输出
var completion = require('../lib/completion');//加载grunt-cli内部的info模块
//用来输出版本信息以及帮助信息的模块
//info.js内部主要就是几个输出grunt信息的方法
var info = require('../lib/info');//加载node自带的路径解析模块
var path = require('path');//获取当前路径
var basedir = process.cwd();
//grunt.js文件的路径
var gruntpath;//判断命令行参数进行相应操作
if ('completion' in options) {//如果grunt命令带有--completion参数,则打印相应的自动补全脚本//grunt --completion=bash这个命令基本上只会在设置自动补全的使用//在自动化工作中并不会用到completion.print(options.completion);
} else if (options.version) {//如果grunt命令带有--version参数,则打印版本信息info.version();
} else if (options.base && !options.gruntfile) {//如果在grunt命令中指定了base文件夹//那么所有操作都会基于这个文件路径进行basedir = path.resolve(options.base);
} else if (options.gruntfile) {//如果grunt命令中指定了gruntfile,那么就会执行这个文件中的任务,同时文件夹切换到对于目录下//默认情况下grunt会在当前目录以及父目录中查找Gruntfile.js或者Gruntfile.coffee文件basedir = path.resolve(path.dirname(options.gruntfile));
}try {//得到grunt.js的地址gruntpath = resolve('grunt', {basedir: basedir});
} catch (ex) {//如果在当前路径没找到,向父目录继续查找gruntpath = findup('lib/grunt.js');// No grunt install found!if (!gruntpath) {//无法找到目录if (options.version) {//如果查询版本信息,由于找不到grunt所以直接退出process.exit(); }if (options.help) { //显示帮助信息info.help(); }info.fatal('Unable to find local grunt.', 99);}
}//调用grunt执行任务,精彩从这里开始
require(gruntpath).cli();

整个过程比较简单,真正有意思的工作在grunt.js中,后续我会跟大家分享这方面的内容。

最后,安利下我的个人博客,欢迎访问: http://bin-playground.top

看看 Grunt 的源码(一):grunt-cli 源码解析相关推荐

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

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

  2. 95-090-024-源码-bin脚本-CLI提交Job-Run详解

    1.视界 2. 概述 请在先阅读:源码-bin脚本-CLI提交Job 内容回顾 Flink客户端通过命令行的形式提交任务时,即执行./flink run xxxx.jar时,真正执行的run逻辑如下: ...

  3. 直播源码和短视频源码,相亲相爱的一家人

    直播源码和短视频源码,相亲相爱的一家人 从直播的百播大战,到如今的趋于稳定:从短视频的兴起,到如今的竞争发展.直播和短视频两条线,开始相交,直播里面添加短视频功能,短视频里面也添加了直播. 在直播里面 ...

  4. 【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )

    文章目录 一.禁止 / 开启内核抢占 与 方法保护临界区 二.编译器优化屏障 三.preempt_disable 禁止内核抢占 源码 四.preempt_enable 开启内核抢占 源码 一.禁止 / ...

  5. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  6. 为什么要看源码、如何看源码,高手进阶必看

    由于项目的需求,最近花了较多的时间来看开源项目的代码,在本文中,简单总结一下对为什么要看源码.如何看源码这两个问题的思考. 看源码的意义 看源码只是一种方法.手段,而不是目的.我也曾经给自己制定过&q ...

  7. python 网站 源码_在线浏览美图源码,附带python源码

    源码介绍 本源码由@香谢枫林 开发,首页图片做了浏览器窗口自适应,最大化占满PC浏览器和移动浏览器的窗口,并且防止出现滚动条. 源码截图 美图源码1 美图源码2 功能介绍 首页图片设置了4个点击功能区 ...

  8. Uboot中start.S源码的指令级的详尽解析 在线版

    http://bbs.chinaunix.net/thread-2312785-1-1.html 以后所有内容更新,都放在这里: Uboot中start.S源码的指令级的详尽解析 在线版 Uboot ...

  9. 深入解析Java字节码和字节码操作类库ASM源码解析

    导语 在非黑即白的静态编译语言和动态脚本语言的分类方法中,java的立场显得很尴尬.首先java是静态强类型语言,所以java源代码是需要编译的.但是javac编译后的产出物并不是和传统的编译语言一样 ...

  10. 【Java集合源码剖析】Hashtable源码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/36191279 Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元 ...

最新文章

  1. 捣鼓 Subversion
  2. suse 11 oracle 10g,suse11+oracle10g安装
  3. 2018/5/12日更新Win7x86x64纯净安装旗舰版WIM下载(启用内置管理员).....
  4. 关于python中self
  5. 比亚迪汉家族3月热销12359辆 汉EV单车销量破万
  6. 惩罚函数外点matlab,禁忌搜索算法求解带时间窗的车辆路径问题(惩罚函数版 附MATLAB代码)...
  7. 做游戏,学编程(C语言) 8 英雄联盟连连看
  8. jquery.pagination 分页插件使用代码
  9. android -- 蓝牙 bluetooth (四)OPP文件传输
  10. 关于两个JS对象指向一个属性
  11. 【功能测试】-【黑盒测试用例】
  12. c语言答案计算鸡兔同笼,鸡兔同笼-题解(C语言代码,思路清晰,简单易懂)
  13. QAC静态代码测试工具试用介绍
  14. 调用Kinect 2.0摄像头
  15. node.js+社区儿童预防接种管理 毕业设计-附源码300924
  16. PHP生成订单号算法
  17. untiy打包发布WebGL
  18. Mac 直接在word 中使用latex编辑公式
  19. 44 Defending the Theory of Evolution Still Seems Needed
  20. 2022年12月10日作业

热门文章

  1. python打包_cx_freeze
  2. ASP.NET学习笔记 1
  3. Java学习day011(oop):
  4. python 加速循环的执行_python循环怎么用多线程去运行
  5. java三大集合_java中三大集合框架
  6. 上海交大研究人员使用非侵入性脑机接口和计算机视觉引导对机器人手臂进行共享控制...
  7. 三星又推出新工具啦!Gear VR 可以兼容多个视频
  8. 虚幻4的关卡动态加载机制
  9. Vuforia 6.1提供4个版本下载
  10. 3秒获得Win11系统管理员权限,微软高危漏洞被公开,只因悬赏奖金打骨折