node.js是如何支持命令行工具开发的

2012-10-18

上次写了一篇文章(用node.js开发命令行工具)介绍如何使用node.js开发命令行工具,那么node.js是如何支持命令行工具开发呢?这篇文章就介绍一下吧。

首先node.js是如何执行js就不说了,直接进入”shebang”和”npm link”这两个东西。首先是”shebang”,node.js是通过这个指令来知道这段代码需要运行在任何目录,而且不需要使用node指令。而”npm link”就是根据文件有没有加”shebang”来做相应处理的,如果文件第一行有”shebang”的话,npm就会根据package.json文件,使模块可以在全局运行,而且不需要加node指令。npm做的事情其实很简单,就是在npm的目录下添加了相应模块的cmd文件,假设一个模块叫做”test”,那么npm就会在其目录(可能为:C:\Documents and Settings\Administrator\Application Data\npm,可以输出path看下npm的路径)下生成一个”test.cmd”文件,而npm目录是在环境变量中的,cmd文件又是可执行文件,所以就可以在任何地方运行”test.cmd”文件了。那么”test.cmd”文件内容又是什么呢?其实也很简单,就是一段让node执行指定js文件的代码。下面的代码可能就是”test.cmd”文件的内容了:

:: Created by npm, please don't edit manually.
@IF EXIST "%~dp0\node.exe" (
    "%~dp0\node.exe"  "%~dp0\node_modules\test\test.js" %*
) ELSE (
    node  "%~dp0\node_modules\test\test.js" %*
)

上面的代码是windows脚本,就是说当前目录如果有node.exe的话,就用当前目录下的node.exe执行当前目录下的”node_modulestesttest.js”文件。如果否则用node(环境变量中)执行这个文件。

在npm的目录中还能找到一个没有后缀的test文件,那这个文件又是干什么的呢?打开文件可以看到如下内容:

#!/bin/sh
basedir=`dirname "$0"`

case `uname` in
        *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac

if [ -x "$basedir/node" ]; then
    "$basedir/node"  "$basedir/node_modules/test/test.js" "$@"
    ret=$?
else 
    node  "$basedir/node_modules/test/test.js" "$@"
    ret=$?
fi
exit $ret

显然这是针对Linux的代码,跟Windows下的代码功能基本一样。

好了,就说到这里了。