欢迎关注我的公众号睿Talk
,获取我最新的文章:
一、前言
我们开发用到的一些库都有自己特有的命令,如webpack,babel和jest等。通过给这些命令输入不同的参数,可以得到相应的功能。通过篇文章,你将学会如何一步步地编写运行在弄的环境的自定义命令。
二、编写命令文件
新建一个文件夹cmd,然后建一个main.js文件,文件内容如下:
#!/usr/bin/env node
console.log('hello command');
注意一定要有这行代码:#!/usr/bin/env node
,这行代码叫shebang
或者hashbang
,它会告诉操作系统在运行这个文件文件的时候,需要用node的解析器来解析。
这时候如果想直接运行这个命令,将会得到一个报错:
需要给这个文件添加一个执行的权限:
chomd +x main.js
这样就能正常的运行这一命令了:
下一步,我们将借助npm的特性,来给我们的命令命名。
三、使用npm定制命令
先在cmd目录初始化npm
npm init
然后在生成的package.json文件中添加以下内容:
"bin":{
"mycmd": "main.js"
},
然后再运行
npm link
完成后就可以直接输入mycmd命令得到结果了
此时你可能会感到疑惑,为什么通过npm link就能实现自定义命令呢?下面我们再详细了解npm link的运作机制。
四、npm link
输入命令后,npm帮我们做了以下这些工作
- 在全局的npm包环境中帮我们建立一个软链,路径在{prefix}/lib/node_modules/<package>。其中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
说得有点远了,再扯回到自定义命令上面来。如果我们希望给命令传入参数,该如何做呢?
五、commander
我们可以借助commander这个工具,帮我们获取到从process.argv
里面传进来的参数,使用方法也很简单:
#!/usr/bin/env node
/**
* Module dependencies.
*/
var program = require('commander');
program
.version('0.1.0')
.option('-p, --peppers', 'Add peppers')
.option('-P, --pineapple', 'Add pineapple')
.option('-b, --bbq-sauce', 'Add bbq sauce')
.option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
.parse(process.argv);
console.log('you ordered a pizza with:');
if (program.peppers) console.log(' - peppers');
if (program.pineapple) console.log(' - pineapple');
if (program.bbqSauce) console.log(' - bbq');
console.log(' - %s cheese', program.cheese);
通过option这个函数来定义支持的参数,然后在使用的时候直接通过获取program的属性拿到传进来的参数。具体用法请看官方文档:commander
六、总结
本文介绍了如何在 Node 开发环境下定制自己的命令,完成一些日常的自动化任务。如果这些任务比较通用,还可以发布到 npm,为更多的人提升效率。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。