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

看之前熟读已下文章:

跟着老司机玩转Node命令行

Nodejs 制作命令行工具

github.com/jaywcjlove/…

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

通过nodejs实现自定义命令

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

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

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

在全局的npm包环境中帮我们建立一个软链,路径在{prefix}/lib/node_modules/。其中prefix可以通过这条命令查询到:

npm get prefix
复制代码

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

npm link

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

npm link cmd
复制代码

其中cmd就是我们的包名。运行完此命令后,npm会帮我们在cmd-test文件夹中的node_modules目录下建立一个cmd的软链。当然,前提是cmd-test文件夹中已经有node_modules目录,否则会一直向上找node_modules目录直到根目录位置。你也可以手动建一个。

npm link cmd的效果跟npm install cmd 效果是完全一样的,我们可以使用link过来的所有功能,这对我们本地调试工具库非常有帮助。

如果要去除这个软链,执行下面的命令就可以了:

npm unlink cmd
复制代码

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

错误处理

在运行

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))
复制代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值