如何快速创建你的全局nodejs命令

857 阅读3分钟

背景

nodejs是可以自带生成全局命令的,方法就是创建一个项目在package.json里面的bin字段中定义一个自定义的命令,比如这样

截屏2023-07-01 15.10.55.png

那么在安装这个包的时候,里面会附带一个create-vite的全局命令,你可以在任何位置执行它.在执行这个命令的时候自动找到这个index.js,然后nodejs去执行它。

当然我们说的是通过命令安装这个包的时候,他会自动扫描包下面的bin,然后将这个命令添加到全局。但是如果是我现在需要本地开发一个全局的命令脚本,该怎么办?

方式一:

我们可以使用npm link。具体怎么操作呢?

我们在本地创建一个文件夹,然后在里面使用npm init或者yarn init 或者pnpm init去在这个文件夹中初始化一个package.json文件,紧接着再创建一个你命令对应的js文件,再在package.json文件夹中添加bin信息,方式和如上图中的一样,键对应你命令的名称,键值对应这个js文件的路径(相对于文件夹根目录),然后你就可以书写这个js文件,里面写一些代码,(注意以#!/usr/bin/env node开头)完成某个功能,比如这样

#!/usr/bin/env node
import minimist from 'minimist'
import { white, red, bgLightGreen } from 'kolorist'
import { $ } from 'execa'
import consola from 'consola'
const argv = minimist(process.argv.slice(2))
const forcePushBranch = argv._[0]
​
async function run(forcePushBranch){
  if (forcePushBranch) {
    consola.info(`Start pushing the current branch to${forcePushBranch}...`)
    await $`git push origin --delete ${forcePushBranch}`
    await $`git branch -D ${forcePushBranch}`
    await $`git branch -c ${forcePushBranch}`
    await $`git push origin ${forcePushBranch}`
  } else {
    consola.error(red('The branch to which it will be pushed does not detect a value'))
  }
}
​
run(forcePushBranch).then(()=>{
  consola.success(bgLightGreen(`${white('Push succeeded!')}`))
})

我们就完成了一个强制推送的功能脚本。

然后假设我的package.json里面的bin是这样定义的

{
  "name": "node-bins-demo",
  "version": "1.0.0",
  "description": "",
  "bin": {
    "force-push": "force-push.js"
  },
  "dependencies": {
    "consola": "^3.1.0",
    "execa": "^7.1.1",
    "kolorist": "^1.8.0",
    "minimist": "^1.2.8",
    "pathe": "^1.1.1"
  }
}

那么大功告成,我们只需要在项目的根目录下执行npm link,那么这个项目连同直接链接到全局,当然这个命令也就在全局生效了。你可以在你的任意被git管理下的项目里面尝试执行force-push <forcePushBranch>这个命令,那么就可以强制将您目前所在的分支代码强制推送到forcePushBranch这个分支上去。

当然你也可以发挥更多想象力,使用nodejs创造一些有意思的脚本命令。来提高工作效率。

但是这个方式有两个弊端

1、如果这个项目被删除了那么这个命令将不复存在。

2、不支持ts,如果想用ts开发脚本,你得通过打包的方式转换成js代码。

方式二:使用第三方库——node-bins

这个库就是为了解决上述两个问题出现的,大概的使用是这样的

截屏2023-07-01 15.57.23.png

使用这个库,你不必再担心本地的脚本项目不小心被删除了的问题,而且也可以使用Typescript进行脚本的开发。

OK,今天简短的分享,希望能够给你带来一些帮助,谢谢观众老爷们。😃