跟着老司机玩转Node自定义命令行

看以前熟读已下文章:html

跟着老司机玩转Node命令行

Nodejs 制做命令行工具

github.com/jaywcjlove/…

node生成自定义命令(yargs/commander)

经过nodejs实现自定义命令

inquirer.js —— 一个用户与命令行交互的工具

Node.js 命令行程序开发教程

输入命令后,npm帮咱们作了如下这些工做

在全局的npm包环境中帮咱们创建一个软链,路径在{prefix}/lib/node_modules/。其中prefix能够经过这条命令查询到:node

npm get prefix
复制代码

将配置文件中的bins连接到全局:{prefix}/bin/{name} 看到这里,你应该了解咱们正是借助第二步,实现自定义命令的。但第一步的命令又有什么做用呢?git

npm link

第一步所作的工做将会为咱们本地开发工具库带来很大的帮助。当咱们的工具库还没完成的时候,咱们并不想将其npm publish出去,而是但愿先在本地调试一下。这时候,能够进入调试的目标项目,好比cmd-test文件夹,运行如下命令:github

npm link cmd
复制代码

其中cmd就是咱们的包名。运行完此命令后,npm会帮咱们在cmd-test文件夹中的node_modules目录下创建一个cmd的软链。固然,前提是cmd-test文件夹中已经有node_modules目录,不然会一直向上找node_modules目录直到根目录位置。你也能够手动建一个。数据库

npm link cmd的效果跟npm install cmd 效果是彻底同样的,咱们能够使用link过来的全部功能,这对咱们本地调试工具库很是有帮助。npm

若是要去除这个软链,执行下面的命令就能够了:json

npm unlink cmd
复制代码

说得有点远了,再扯回到自定义命令上面来。segmentfault

错误处理

在运行bash

npm install . -g 
复制代码

会有一堆警告能够忽视工具

若是你已经 npm link 搞了一遍你再 link 一遍,会报以下错误。即便你 npm unlink 也会报以下错误:

npm link
npm ERR! Darwin 14.3.0
npm ERR! argv "node" "/usr/local/bin/npm" "link"
npm ERR! node v0.10.36
npm ERR! npm  v2.7.1
npm ERR! path /usr/local/bin/wcj
npm ERR! code EEXIST

npm ERR! Refusing to delete: /usr/local/bin/wcj not in /Applications/XAMPP/xamppfiles/htdocs/git/github.com/myJS/wcj
File exists: /usr/local/bin/wcj
Move it away, and try again.
让你删除 /usr/local/bin/wcj 再 npm link , 删除此目录运行 rm -rf /usr/local/bin/wcj
复制代码

发布到npm中

  • 发布

必须注册 npm 帐号,还有 github 帐号,具体怎么玩儿问 谷歌大婶吧。在JSLite.io 中也有教程哦。

npm publish
复制代码
  • 安装 前提你发布到了npm中,你就能够运行下面的命令了。
sudo npm install -g sx
复制代码

DEMO

  • package.json
{
 "name": "sx",
 "version": "1.0.0",
 "description": "SX CMD",
 "bin": {
   "sx": "bin/index.js"
 },
 "main": "index.js",
 "author": "sx",
 "license": "MIT",
 "devDependencies": {
   "commander": "^2.19.0",
   "yargs": "^13.2.1"
 }
}

复制代码
  • bin/index.js
#!/usr/bin/env node

var program = require('commander');
var argv = require('yargs').argv;
program
   .allowUnknownOption() //取消这个自动报错机制
   .version('0.0.1')
   .description('建立个人命令')
   .option('-r, --resume', '简历')
   .option('-d, --no-database [db]', '自定义数据') //后面能够选择是否跟参数值,no-*时默认值为false
   .option('-m, --mylove [db]', '个人最爱') //后面能够选择是否跟参数值,不加no-*时默认值为true
   .option('-l, --language <lang>', 'JS是我擅长的语言。') //<lang> required参数,使用时后边必须跟参数值, 不然程序会报错
   .action(option => {
       console.log('\n option回调:');
       console.log(JSON.stringify(option));
    })
   .on('--help', function() {
   	console.log('---------------------------------------------------------------------------------------------')
   	console.log(' 自定义的例子: ')
   	console.log('')
   	console.log(' 输出命令 sx -d')
   	console.log(' 输出命令 sx -l node')
   	console.log('')
   })
   .parse(process.argv)


if(program.resume) {
   console.log('简历' + program.resume + '这个是个人简历!');
}

if(program.language) console.log('我擅长的语言language: `' + program.language + '`');
if(program.database) console.log('我擅长的数据库`' + program.database + '`');
if(program.mylove) console.log('个人最爱`' + program.mylove + '`');

console.log('\n program回调:');
console.log(program)
//console.log(JSON.stringify(program))

console.log('\n argv回调:');
console.log(JSON.stringify(argv))
复制代码

相关文章
相关标签/搜索