5

一、快速入手

1.1 背景:

好多nodejs包都提供命令行工具。咱也来学学吧。

1.2 刀耕火种时代:

环境:
win32_X86
nodejs: v5.9.1
npm: 3.7.3
首先创建个bat文件(cli-demo.bat),bat文件中调用node命令执行相应的js文件(index.js):
index.js内容:

'use strict';
function add(args) {
    var sum = 0;
    args.forEach(function(number){
        var num = +number;
        if(!isNaN(num)){
            sum += +num;    
        }
        
    })
    return sum;
}
var args = process.argv.slice(2); // 处理参数
var sum = add(args);
console.log(sum);

cli-demo.bat内容(index.js相同目录):

@ECHO OFF
SETLOCAL
SET "NODE_EXE=%~dp0\node.exe"     
IF NOT EXIST "%NODE_EXE%" (
  SET "NODE_EXE=node"     ::
)
:: 执行指定的js,并传入参数
"%NODE_EXE%" "index.js" %*

然后把bat文件路径添加到PATH环境变量中。
在index.js父目录下打开cmd,并执行:

clipboard.png

创建bat文件,把bat路径添加到PATH中过程是复杂了点,还好npm可以帮我们做这些事。

二、npm与命令行工具

先初始化个npm项目

2.1 package.json-bin配置

【创建bat文件,把bat路径添加到PATH中】这些固定的工作可以由npm帮我们完成。package.json中有个bin字段配置

bin: {
"commandName1": "path/to/executableFile1",  // 路径相对于package.json的目录
"commandName2": "path/to/executableFile2",
}

可执行文件可以是js文件或者无扩展名的文本文件,并且文件开头第一行是"#!/usr/bin/env node"。在安装包时npm就会根据bin配置生成对应的脚本(bat 或者 shell)。如果可执行文件的第一行不是"#!/usr/bin/env node",则生成的脚本文件只是简单的指向bin配置的可执行文件。

2.2 举例:

Step1:创建package.json文件,并配置bin字段。

package.json:

"bin":{
      "cli-demo": "./bin/cli-demo"
  }

Step2:在和package.json相同的目录下创建bin目录,在bin目录中添加cli-demo文本文件。
./bin/cli-demo:

#!/usr/bin/env node
console.log('heheh');

Step3:发布包(前提在控制台登录npm账户)

npm login
npm publish

如果没有报错提示的化,那就说明发布包成功了,接下来就可以被其他人引用了。
Step4:安装包

npm i -g cli-demo

查看下安装目录中生成的脚本文件:cli-demo.bat

@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe"  "%~dp0\node_modules\cli-demo\bin\cli-demo" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node  "%~dp0\node_modules\cli-demo\bin\cli-demo" %*
)

文件内容就是调用node执行bin配置的文件。
Step5:执行命令

cli-demo

clipboard.png

2.3 npm干了什么

A:根据bin字段配置,生成脚本文件(bat for window, shell for unix)。

脚本名称:等于bin字段的属性名字
脚本内容:调用node名字执行bin字段对象属性值指定的文件

B:把生产的脚本文件放在指定目录中

全局安装:prefix/
本地安装:./node_module/.bin/

三、扩展

一般一个命令由三部分构成:命令名称 选项 参数。
命名名称:指定运行的命名
选项:修改命令的操作行为
参数:传给命令运行的参数
处理选项和参数可以使用其他库,如CommandJS。

参考

  1. 用Node.js创建命令行工具
  2. npm-bin配置
  3. Command-line utilities with Node.js

普拉斯强
2.7k 声望53 粉丝

Coder