wns9778.com_威尼斯wns.9778官网

热门关键词: wns9778.com,威尼斯wns.9778官网
wns9778.com > 计算机教程 > 利用node.js制作命令行工具方法教程(一)

原标题:利用node.js制作命令行工具方法教程(一)

浏览次数:98 时间:2019-08-10

前言

一. 先了解一下package.json

之前使用过一些全局安装的NPM包,安装完之后,可以通过其提供的命令,完成一些任务。比如Fis3,可以通过fis3 server start 开启fis的静态文件服务,通过fis3 release开启文件编译与发布;还有vue-cli,可以通过vue init webpack my-project来初始化vue webpack的项目基础配置。最近有一个需求,需要写一个类似vue-cli的NPM包,通过命令行操作实现项目初始配置,所以就查看了相关资料,学习了一下如何使用node来生成自己的命令。

每个项目的根目录都有一个 package.json 文件,定义了这个项目所需要的各种模块,以及项目的配置信息,下面是一个比较完整的package.json文件

编写命令行

{
 "name": "vue-cli",
 "version": "2.9.3",
 "description": "A simple CLI for scaffolding Vue.js projects.",
 "preferGlobal": true,
 "bin": {
 "vue": "bin/vue",
 "vue-init": "bin/vue-init",
 "vue-list": "bin/vue-list"
 },
 "repository": {
 "type": "",
 "url": ""
 },
 "keywords": [
 ],
 "author": "litongqian",
 "license": "MIT",
 "bugs": {
 "url": ""
 },
 "homepage": "",
 "scripts": {
 "test": "npm run lint && npm run e2e",
 "start": "node index.js"
 },
 "dependencies": {
 "async": "^2.4.0",
 "chalk": "^2.1.0",
 },
 "devDependencies": {
 "chai": "^4.1.2",
 "eslint": "^3.19.0",
 },
 "engines": {
 "node": ">=6.0.0"
 }
}

命令的目标:在当前目录下开启一个静态文件服务,端口号为8085

1. 其中scripts字段

1.创建目录

指定了运行脚本命令的npm命令行缩写,比如start指定了运行 npm run start 时,所要执行的命令。

构成命令的基础是需要一个命令文件web.js和package.json配置文件,执行以下命令:

2. bin字段

$ mkdir node-commander #创建一个文件夹

$ cd node-commander && mkdir bin

$ npm init #初始化package.json文件<br>$ cd bin && touch web.js #创建命令文件

bin项用来指定各个内部命令对应的可执行文件的位置

2.命令文件 

"bin": {
 "vue": "bin/vue",
 "vue-init": "bin/vue-init",
 "vue-list": "bin/vue-list"
 },
#!/usr/bin/env node



var express = require('express');

var path = process.cwd();



function run(argv) {

 if (argv[0] === '-v' || argv[0] === '--version') {

 console.log('version is 1.0.0');

 }

 else if (argv[0] === '-h' || argv[0] === '--help') {

 console.log('usage:n');

 console.log('-v --version [show version]')

 }

 else if (argv[0] === '-s' || argv[0] === '--start') {

 var app = new express();

 app.use('/static', express.static(path));

 app.listen(8085, function () {

 console.log('server start at port 8085');

 });

 }

}



run(process.argv.slice(2)); 

上面代码指定, vue 命令对应的可执行文件为 bin 子目录下的 vue 。

文件的头部务必加入#!/usr/bin/env node这行代码,这里表示使用node作为脚本的解释程序,node的路径通过env来查找,可以避免node安装路径不一带来的问题。

3. npm link

其中process为node进程中的全局变量,process.argv为一数组,数组内存储着命令行的各个部分,argv[0]wns9778.com,为node的安装路径,argv[1]为主模块文件路劲,剩下为子命令或参数,如下:

开发NPM模块的时候,有时我们会希望,边开发边试用,比如本地调试的时候, require('myModule') 会自动加载本机开发中的模块。Node规定,使用一个模块时,需要将其安装到全局的或项目的 node_modules 目录之中。对于开发中的模块,解决方法就是在全局的 node_modules 目录之中,生成一个符号链接,指向模块的本地目录。

node ./bin/web.js a b c

# process.argv的值为[ '/usr/local/bin/node', '/PATH/web.js', 'a', 'b', 'c' ]

npm link 就能起到这个作用,会自动建立这个符号链接。

3.命令配置

请设想这样一个场景,你开发了一个模块 myModule ,目录为 src/myModule ,你自己的项目 myProject 要用到这个模块,项目目录为 src/myProject 。首先,在模块目录( src/myModule )下运行 npm link 命令。

在package.json文件中添加bin字段:

src/myModule$ npm link
"bin": {

 "web": "./bin/web.js"

 },  

上面的命令会在NPM的全局模块目录内,生成一个符号链接文件,该文件的名字就是 package.json 文件中指定的模块名。

bin字段的作用:当安装npm包时,npm将添加一条命令/usr/local/bin/web,web命令软连接到web.js文件。

/path/to/global/node_modules/myModule -> src/myModule

调试命令行

这个时候,已经可以全局调用 myModule 模块了。但是,如果我们要让这个模块安装在项目内,还要进行下面的步骤。

(1)采用install方法

切换到项目目录,再次运行 npm link 命令,并指定模块名。

进入npm包目录下,执行全局install,根据package.json中bin的配置,为全局命令创建软连。

src/myProject$ npm link myModule
# sudo npm install . -g
/usr/local/bin/web -> /usr/local/lib/node_modules/cli-demo/bin/web.js

/usr/local/lib

`-- cli-demo@1.0.0
...

上面命令等同于生成了本地模块的符号链接。

查看web命令

复制代码 代码如下:

# which web 

/usr/local/bin/web  

src/myProject/node_modules/myModule -> /path/to/global/node_modules/myModule

执行web命令

然后,就可以在你的项目中,加载该模块了。

# web --start

server start at port 8085
var myModule = require('myModule');

(2)采用npm link方法

这样一来, myModule 的任何变化,都可以直接反映在 myProject 项目之中。但是,这样也出现了风险,任何在 myProject 目录中对 myModule 的修改,都会反映到模块的源码中。

npm link方法创建了两个软连,命令与命令文件的软连,全局包与实际包文件的软连。

如果你的项目不再需要该模块,可以在项目目录内使用 npm unlink 命令,删除符号链接。

# sudo npm link



/usr/local/bin/web -> /usr/local/lib/node_modules/cli-demo/bin/web.js

/usr/local/lib/node_modules/cli-demo -> /Users/baidu/hwm/home/demos/node/node-commander  
src/myProject$ npm unlink myModule

接下来可以按照方法(1)进行操作了。

二. 可执行脚本

发布命令包

写一个简单的脚本hello

通过npm publish进行发布,前提是有npm帐号。如何操作可以查看npm 官方文档

$ mkdir hello #创建一个文件夹

本文是通过原生node.js来开发命令工具,而vue-cli是采用commander.js来简化命令工具开发,关于commander.js的使用方法,将在下一篇文章中介绍。

$ cd hello && touch hello #创建命令文件

总结

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

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

文件的头部务必加入#!/usr/bin/env node这行代码,这里表示使用node作为脚本的解释程序,node的路径通过env来查找,可以避免node安装路径不一带来的问题。

您可能感兴趣的文章:

打开 /usr/bin/env,可以查看到PATH,操作系统通过路径找到node

wns9778.com 1

然后,修改 hello 的权限。

$ chmod 755 hello
$./hello

wns9778.com 2

如果想把 hello 前面的路径去除,可以将 hello 的路径加入环境变量 PATH。但是,另一种更好的做法,是在当前目录下新建 package.json ,写入下面的内容。

{
 "name": "hello",
 "bin": {
 "hello": "./hello"
 }
}

然后执行 npm link 命令。不明白的看上面

$ npm link

wns9778.com 3

执行后会产生一个全局的映射关系,就可以全局使用hello命令了

三.命令行参数

命令行参数可以用系统变量 process.argv 获取。

修改hello脚本

#!/usr/bin/env node
console.log('hello ', process.argv);

其中process为node进程中的全局变量,process.argv为一数组,数组内存储着命令行的各个部分,argv[0]为node的安装路径,argv[1]为主模块文件路劲,剩下为子命令或参数,如下:

$ hello a b c

# process.argv的值为[ '/usr/local/bin/node', '/usr/local/bin/hello', 'a', 'b', 'c' ]

脚本可以通过 child_process 模块新建子进程,从而执行 Unix 系统命令,修改hello

exec 方法用于执行bash命令, exec 方法最多可以接受两个参数,第一个参数是所要执行的shell命令,第二个参数是回调函数,该函数接受三个参数,分别是发生的错误、标准输出的显示结果、标准错误的显示结果。

#!/usr/bin/env node
var name = process.argv[2];
var exec = require('child_process').exec;

var child = exec('echo hello '   name, function(err, stdout, stderr) {
 if (err) throw err;
 console.log(stdout);
});

本文由wns9778.com发布于计算机教程,转载请注明出处:利用node.js制作命令行工具方法教程(一)

关键词: wns9778.com

上一篇:canvas学习之路--记录(二)

下一篇:没有了