看之前熟读已下文章:
跟着老司机玩转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))
复制代码