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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Python 开发者的 6 个必备库

来自:开源中国 协作翻译 链接: https://www.oschina.net/translate/6-essential-libraries-for-e...

4257
来自专栏全华班

一款免费、开源,使用JAVA语言开发管理系统

基于SpringBoot2.0的权限管理系统 易读易懂、界面简洁美观。 核心技术采用Spring、MyBatis、Shiro没有任何其它重度依赖。直接运行即可用

1252
来自专栏Jerry的SAP技术分享

错误消息 This computer doesn't have VT-X/AMD-v enabled

在VirtualBox的Ubuntu虚拟机里试图本地安装Kyma(一个基于Kubernetes的开源框架)时,遇到下面的错误信息:

1212
来自专栏乐享123

Different Users in Same Unix Group Can Not Run Mongod

1003
来自专栏北京马哥教育

每个极客都应该知道的Linux技巧

检查不是由你运行的程序 难度:高级 应用程序:bash(译注:UNIX或者LINUX的shell) 想象下这个场景-你已经准备好了要和同事在办公室里对战一局快速...

26710
来自专栏张戈的专栏

WordPress后台首页显示RSS错误的解决办法

这两天,麻烦不断,可能是因为我折腾的比较频繁吧!老是出现奇奇怪怪的问题,而且百度、GG 居然搜不到有用的解决办法!折腾了大半天,终于被我搞定,虽然还是很笨的方法...

3566
来自专栏北京马哥教育

Python 开发者的 6 个必备库

https://www.oschina.net/translate/6-essential-libraries-for-every-python-develop...

1296
来自专栏java思维导图

开源项目spring-shiro-training思维导图,让项目不再难懂

"GOOD 写在前面 多多阅读源码,对技术提高很有帮助。首先需要读懂别人的代码。 终于完成了一个开源项目的思维导图解读。选spring-shiro-traini...

3576
来自专栏JMCui

Hybris安装和各个Extention简单介绍

前言:突然想好好梳理一下这几个月所学的内容了,顺便让自己的知识有一个系统的框架。这种安装仅仅适用于开发环境,不适于生产环境。 一、  安装JDK 请安装最新的O...

34511
来自专栏FreeBuf

巡风风险扫描开源系统的一些演变

同程SRC团队开源巡风资产风险控制系统也有一段时间了,我们临时用它作为一个简单的soc平台来使用,期间也做了一些定制化开发,此次分享,权当做个笔记吧。基于巡风我...

942

扫码关注云+社区