看以前熟读已下文章:html
在全局的npm包环境中帮咱们创建一个软链,路径在{prefix}/lib/node_modules/。其中prefix能够经过这条命令查询到:node
npm get prefix
复制代码
将配置文件中的bins连接到全局:{prefix}/bin/{name} 看到这里,你应该了解咱们正是借助第二步,实现自定义命令的。但第一步的命令又有什么做用呢?git
第一步所作的工做将会为咱们本地开发工具库带来很大的帮助。当咱们的工具库还没完成的时候,咱们并不想将其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 帐号,还有 github 帐号,具体怎么玩儿问 谷歌大婶吧。在JSLite.io 中也有教程哦。
npm publish
复制代码
sudo npm install -g sx
复制代码
{
"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"
}
}
复制代码
#!/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))
复制代码