资讯专栏INFORMATION COLUMN

通过nodejs实现自定义命令

scola666 / 1809人阅读

摘要:通过给这些命令输入不同的参数,可以得到相应的功能。通过篇文章,你将学会如何一步步地编写运行在弄的环境的自定义命令。其中可以通过这条命令查询到将配置文件中的链接到全局看到这里,你应该了解我们正是借助第二步,实现自定义命令的。

欢迎关注我的公众号睿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/。其中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,为更多的人提升效率。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90415.html

相关文章

  • nodejs 写一个命令行工具 :创建 react 组件的命令行工具

    摘要:用写一个命令行工具创建组件的命令行工具前言上周,同事抱怨说怎么不能像那样,使用命令行工具来生成一个组件。为什么不能将这个过程交给程序去做呢当天晚上,我就仿照的,写了一个生成组件的命令行工具。 用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具 前言 上周,同事抱怨说 react 怎么不能像 angular 那样,使用命令行工具来生成一个组件。对呀,平时工作时,想要...

    WelliJhon 评论0 收藏0
  • Nodejs模块加载与ES6模块加载实现

    摘要:以后需要引用模块的变量函数类就在这个模块对象的取出,即使再次进来模块也不会重新执行,只会从缓存获取。所以对相同模块的再次加载都是优先缓存方式,核心模块的缓存检查依然优先于文件模块。内建模块导出启动会生成全局变量,提供方法协助加载内建模块。 原始时代 作为一门语言的引入代码方式,相较于其他如PHP的include和require,Ruby的require,Python的import机制,...

    陈江龙 评论0 收藏0
  • gulp和webpack入门介绍

    摘要:介绍说明的包管理器,用于插件管理包括安装卸载管理依赖等使用安装插件命令提示符执行插件名称。总结安装新建文件全局和本地安装安装插件新建文件通过命令提示符运行任务。 showImg(https://segmentfault.com/img/remote/1460000010873466); 前言 众所周知目前比较火的工具就是gulp和webpack,但webpack和gulp却有所不同,本...

    hsluoyz 评论0 收藏0
  • 十分钟搭建centos+nodejs+nestjs+caddy+pm2线上环境

    摘要:安装及线上环境配置安装官方安装说明地址执行命令至此,安装完成版本查看安装官方文档地址首次安装执行命令以后创建项目只需在你需要的路径下执行开发测试环境下直接执行以下命令启动项目后面加上可以在修改现有文件后自动进行重启浏览器输入即可 centos+node.js+nest.js+caddy+pm2安装及线上环境配置 node.js安装 官方安装说明地址 https://github.com...

    xiaoqibTn 评论0 收藏0
  • webpack工程化集成React技术栈(一)

    项目开始前,我们先聊一聊关于项目的一些说明。该项目起始于2017年初,当时公司主要技术栈为gulp+angular,鉴于react的火热的生态,在公司决定研发bss管理系统时选用react开发,目的也是为react native打下基础,以解决后期公司大前端技术栈的逐步成熟。(当时没有选择vue开发的主要原因是weex生态还不够特别成熟),既然决定换新,项目的构建也跟着一起换,从gulp转向火热的...

    tianhang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<