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},而是一份参数说明!!!不得不佩服作者的用心良苦。
nodejs直接调用grunt(非调用批处理)的更多相关文章
- JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)
JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...
- [复习] JAVA 遍历目录 (递归调用和非递归)
JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...
- python绑定调用和非绑定调用
绑定调用和非绑定调用 在python中,绑定调用和非绑定调用其实是相对于类和实例来说的.抽象点说就是:在类实例化过程中,类的方法会绑定在实例之中,此时,这个实例会拥有这个类的具体属性和方法,这些属性和 ...
- nodejs进阶(2)—函数模块调用
函数调用 1. 文件内普通函数调用 创建一个js文件命名为2_callFunction.js,其中定义一个函数fun1,向返回对象输出了一段字符串“你好,我是fun1”. //------------ ...
- 【VB技巧】VB静态调用与动态调用dll详解
本文“[VB技巧]VB静态调用与动态调用dll详解”,来自:Nuclear'Atk 网络安全研究中心,本文地址:http://lcx.cc/?i=489,转载请注明作者及出处! [[请注意]]:在以下 ...
- Dubbo学习笔记4:服务消费端泛化调用与异步调用
本文借用dubbo.learn的Dubbo API方式来解释原理. 服务消费端泛化调用 前面我们讲解到,基于Spring和基于Dubbo API方式搭建简单的分布式系统时,服务消费端引入了一个SDK二 ...
- 《oracle每天一练》触发器不能调用或间接调用COMMIT,ROLLBACK等DCL语句
触发器不能调用或间接调用COMMIT,ROLLBACK等DCL语句 在触发器中不能运行 ddl语句和commit,rollback语句 ddl语句:DDL语句用语定义和管理数据库中的对象,如Creat ...
- 反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)
反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性.字段),而不去使用Invoke方法) 创建Delegate (1).Delegate.CreateDelegate(Type, ...
- java三种调用方式(同步调用/回调/异步调用)
1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消息或事件的机制 ...
随机推荐
- asp.net mvc5 安装
原文地址 http://docs.nuget.org/docs/start-here/using-the-package-manager-console 工具-->NuGet程序包管理器--&g ...
- bash 设置
export COLUMNS=500 $* 将所有命令行参数当做单个文本值包含 $@ 将所有命令行参数当做独立的文本值包含 $# 命令行参数数目 $? 最近使用的前端进程的退出状态码 $- 当前命令选 ...
- 《数据挖掘:R语言实战》
<数据挖掘:R语言实战> 基本信息 作者: 黄文 王正林 丛书名: 大数据时代的R语言 出版社:电子工业出版社 ISBN:9787121231223 上架时间:2014-6-6 出版 ...
- window.opener()方法
<!DOCTYPE html><html><head><meta charset="GBK"><title>菜鸟教程(r ...
- java操作mongodb(连接池)(转)
原文链接: java操作mongodb(连接池) Mongo的实例其实就是一个数据库连接池,这个连接池里默认有10个链接.我们没有必要重新实现这个链接池,但是我们可以更改这个连接池的配置.因为Mong ...
- textrank的方法,大概懂了
https://www.cnblogs.com/clover-siyecao/p/5726480.html 介绍了textrank. 不过我觉得对于长文本,textrank才有用些.短文本的话,估计没 ...
- HDU1208:Pascal's Travels(DP)
Problem Description An n x n game board is populated with integers, one nonnegative integer per squa ...
- cesium原理篇(二)--网格划分【转】
转自:http://www.cnblogs.com/fuckgiser/p/5772077.html 上一篇我们从宏观上介绍了Cesium的渲染过程,本章延续上一章的内容,详细介绍一下Cesium网格 ...
- COCO数据集深入理解
TensorExpand/TensorExpand/Object detection/Data_interface/MSCOCO/ 深度学习数据集介绍及相互转换 Object segmentation ...
- MFC中如何显示颜色选择对话框
其实很简单,使用MFC现有的类CColorDialog 即可实现 核心代码如下: void CCColorDialogView::OnGraphSetting() { CColorDialog m_s ...