nodejs直接調用grunt(非調用批處理)


在windows下,我們做js構建工作,都習慣安裝grunt-cli,只需要命令行grunt。。。一切構建工作都自動完成了。這已經是很完美的情況了,不過最近要做一個服務器版的自動化構建系統,在nodejs中調用批處理執行grunt就顯得很矬,而且各種問題。是否有更好,更漂亮的方式呢?

grunt本來就是nodejs程序,安裝后表現為一個node_module,那么cli是什么呢?這只是一個nodejs寫的命令行界面。所以,nodejs肯定可以直接在js層面調用grunt。

我們需要做的,只需要揭開cli的面紗。

首先,看看cli安裝后的位置:

(win7)

C:\Users\kenkozheng\AppData\Roaming\npm\node_modules\grunt-cli

 

 cli主要代碼是一堆參數判斷處理,但最終實際關鍵點是grunt.cli( )

#!/usr/bin/env node

'use strict';

process.title = 'grunt';

// Especially badass external libs.
var findup = require('findup-sync');
var resolve = require('resolve').sync;

// Internal libs.
var options = require('../lib/cli').options;
var completion = require('../lib/completion');
var info = require('../lib/info');
var path = require('path');


var basedir = process.cwd();
var gruntpath;

// Do stuff based on CLI options.
if ('completion' in options) {
  completion.print(options.completion);
} else if (options.version) {
  info.version();
} else if (options.base && !options.gruntfile) {
  basedir = path.resolve(options.base);
} else if (options.gruntfile) {
  basedir = path.resolve(path.dirname(options.gruntfile));
}

try {
  gruntpath = resolve('grunt', {basedir: basedir});
} catch (ex) {
  gruntpath = findup('lib/grunt.js');
  // No grunt install found!
  if (!gruntpath) {
    if (options.version) { process.exit(); }
    if (options.help) { info.help(); }
    info.fatal('Unable to find local grunt.', 99);
  }
}

// Everything looks good. Require local grunt and run it.
require(gruntpath).cli();

 

 

那么我們回到自己的nodejs項目中,先安裝好grunt模塊,然后在js代碼中輕輕寫上兩句:

var grunt = require('grunt');
console.log(grunt.cli);
grunt.cli({
    gruntfile: __dirname + '/applications/5/check_out/Gruntfile.js'
});

 

 一切就搞掂了,非常順利。

不過,這里有個小坑,折騰了kenko一點時間,就是gruntfile必須是絕對路徑,不能是相對路徑。

最后,不得不贊一下grunt的代碼。如果我們不懂cli的參數,只需要console.log(grunt.cli),這不是冷冰冰的輸出function(){xxxx},而是一份參數說明!!!不得不佩服作者的用心良苦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM