看看 Grunt 的源碼(一):grunt-cli 源碼解析

因爲未來工做須要最近學習了Grunt,至於Grunt是什麼你們百度下就行了,我就很少說了。對於它內部的實現比較感興趣,因此看了看源碼。今天先來講說grunt命令行工具grunt-cli的實現。javascript

grunt-cli是創建在grunt基礎上的命令行工具,經過它能夠很方便的使用grunt進行一些自動化任務。grunt-cli的處理過程主要分爲下面幾步:java

  1. 加載必須的模塊,這其中包括第三方模塊和grunt-cli內部的模塊node

  2. 獲取命令行參數執行相應的操做bash

  3. 查找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中,後續我會跟你們分享這方面的內容。學習

最後,安利下個人我的博客,歡迎訪問: http://bin-playground.top

相關文章
相關標籤/搜索