今年搬进新家之后,供暖的第一年暖气各种问题。供暖后,家里一直不暖和,在家办公还要穿棉裤,是怎么样的一个体验? 和供暖公司沟通后,第一次上门检查无果;第二次说是入口流量太慢,换了热水阀,热水流量没问题了,但是温控阀总是自动关闭,物业推给热力,热力推给温控阀厂家,温控阀厂家周末打电话没人接。真想送给相关单位一面锦旗「制冷先锋」。爱人和我吐槽,这个冬天我们靠一身的浩然正气也可以扛的过去。 我已经感冒一周了,上了年纪身体素质就是不行。

😄习惯了翻译稿前加点碎碎念,勿怪。 这篇是介绍如何用Node 写一个CLI工具,扫了一遍,简单几分钟上手,可以封装一些常用的脚本,成为自己提高效率的小工具箱。 原文: How to make beautiful, simple CLI apps with Node - DEV Community 👩‍💻👨‍💻

image.png

命令行应用以一种优雅的方式去处理整合一些重复的任务,这篇文章将引导你创建一个CLI应用,整合一些实用的命令行小工具。
大纲:

  1. 想法 💡
  2. 命令行输入 🚇
  3. 处理顺序动作✨
  4. 可执行的JavaScript 文件🦅
  5. 发布到 npm 🚀

萌生想法 💡

当merge/rebase, package-lock 文件的冲突是真滴烦。我们来聊聊如何整些实用的小技巧来删除package-lock.json,通过npm install 再创建它,并把它添加到git 索引。
你可以这个链接找到这个方法 GitHub - HugoDF/fix-package-lock: Fix package-lock.json by regenerating it
安装后 执行 npx fix-package-lock 来预览下最后的结果。

命令行输入 🚇

开始我们利用来自Sindre Sohrus的execa 号称「更好的子线程」,安装这个模块:

  1. npm i execa -S

创建index.js

  1. const execa = require(‘execa');
  2. execa(‘ls’).then(result => console.log(result.stdout));

执行node index, 在命令行中会看见如下文件信息

  1. node index.js
  2. index.js
  3. node_modules
  4. package-lock.json
  5. package.json

处理顺序动作✨

在生成 package-lock 文件,我们需要先删除它,然后执行 npm i 生成它。到这我们可以使用 Listr,它可以让我们这样处理刚才描述的任务

image.png

执行 npm i listr -S 然后修改index.js

  1. const execa = require(‘execa')
  2. const Listr = require(‘listr’)
  3. new Listr([
  4. {
  5. title: Removing package-lock’,
  6. task: () => execa(‘rm’, [‘package-lock.json’])
  7. },
  8. {
  9. title: Running npm install’,
  10. task: () => execa(‘npm’, [‘install’])
  11. },
  12. {
  13. title: Adding package-lock to git’,
  14. task: (ctx, task) => execa(‘git’, [‘add’, package-lock.json’]).catch(() => task.skip())
  15. }
  16. ]).run()

现在执行node index 有如下效果

6D6D2D71-D7A8-4CFD-8CD3-B671AB7CC36B.png

当你执行一个长时间的任务,Listr 给你一种loading状态,返回一个 Promise。体验类似你通过 npm install 安装 execa
还可以显示使用Observables更改的消息,有关更多信息,请参阅Listr文档

可执行的JavaScript 文件🦅

比较理想的情况是直接执行./index.js , 而不是node index.js, 为了实现它 我们执行 chmod +x 让它在UNIX系统变成可执行文件

  1. chmod +x index.js

然后,我们需要添加文件头通知系统应如何尝试运行该文件:

  1. #!/usr/bin/env node

把这一行添加到 index.js 的第一行

  1. #!/usr/bin/env node
  2. const execa = require(‘execa’);
  3. const Listr = require(‘listr’);
  4. new Listr([
  5. {
  6. title: Removing package-lock’,
  7. task: () => execa(‘rm’, [‘package-lock.json’])
  8. },
  9. {
  10. title: Running npm install’,
  11. task: () => execa(‘npm’, [‘install’])
  12. },
  13. {
  14. title: Adding package-lock to git’,
  15. task: (ctx, task) =>
  16. execa(‘git’, [‘add’, package-lock.json’])
  17. .catch(() => task.skip())
  18. }
  19. ]).run();

现在我们可以这样执行

  1. ./index.js

在package中添加bin

package.json

  1. {
  2. name”: beautiful-cli",
  3. version”: 1.0.0”,
  4. description”: A simple CLI”,
  5. main”: index.js”,
  6. bin”: {
  7. fix-package-json”: “./index.js
  8. }
  9. dependencies”: {
  10. execa”: “^0.10.0”,
  11. listr”: “^0.14.1
  12. }
  13. }

发布到 npm 🚀

最后留给读者一个小练习,通过 np 这个包发布到npm ,np 真滴是超级好用
提示:在您要发布的任何程序包中运行npx np
你可以看到完整的代码 https://github.com/HugoDF/fix-package-lock