在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},而是一份參數說明!!!不得不佩服作者的用心良苦。