因爲未來工做須要最近學習了Grunt,至於Grunt是什麼你們百度下就行了,我就很少說了。對於它內部的實現比較感興趣,因此看了看源碼。今天先來講說grunt命令行工具grunt-cli的實現。javascript
grunt-cli是創建在grunt基礎上的命令行工具,經過它能夠很方便的使用grunt進行一些自動化任務。grunt-cli的處理過程主要分爲下面幾步:java
加載必須的模塊,這其中包括第三方模塊和grunt-cli內部的模塊node
獲取命令行參數執行相應的操做bash
查找grunt.js文件並執行任務grunt
下面的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中,後續我會跟你們分享這方面的內容。學習