Skip to content

CLI 基础

快速入门

1. shebang

shebang 是 Unix 系统中用来指定脚本解释器的机制。

通过在脚本的第一行添加 #!/usr/bin/env node,可以确保脚本在正确的 Node.js 环境中运行。

js
#!/usr/bin/env node

console.log('hello world')

2. bin

package.json 中,可以通过 bin 字段指定可执行文件。

json
{
  "name": "my-cli",
  "version": "1.0.0",
  "bin": {
    "my-cli": "src/index.js",
    "joke": "src/joke.js"
  }
}

安装之后,会生成两个可执行的命令:

  1. my-cli
  2. joke

CLI 常用库

commander.js

commander.js 是一个用于构建命令行接口的库。

js
import { Command } from 'commander'

const program = new Command()

program
  .version('0.0.1')
  .description('An example CLI for managing tasks')
  .option('-d, --debug', 'output extra debugging')
  .command('add <task>', 'add a new task')
  .command('remove <task>', 'remove a task')
  .parse(process.argv)

if (program.debug) {
  console.log(program.opts())
}

chalk

chalk 是一个用于样式化终端字符串的库。

js
import chalk from 'chalk'

console.log(chalk.bgGreen('Hello world!'))

chalk-animation

chalk-animation 是一个用于创建彩色动画文本的库。

js
import chalkAnimation from 'chalk-animation'

chalkAnimation.rainbow('Hello world!')

inquirer

inquirer 是一个用于创建交互式命令行界面的库。

js
import inquirer from 'inquirer'

async function askName() {
  const answers = await inquirer.prompt({
    name: 'player_name',
    type: 'input',
    message: 'What is your name?',
    default() {
      return 'Player'
    },
  })

  playerName = answers.player_name
}

CLI 技巧

定义 npm scripts

package.json 中通过 scripts 字段定义脚本命令。

json
{
  "scripts": {
    "command": "modern command"
  }
}

传递参数

-- 是一个分隔符,用于将参数传递给脚本,而不是 npm 本身。

bash
# 将 --option 传递给脚本
npm run command -- --option

# 如果省略 --,参数可能会被 npm 解析
npm run command --option

区别

  • npm run command -- --option--option 会传递给 command 脚本。
  • npm run command --option--option 会被 npm 解析,而不是传递给脚本。

基于 MIT 许可发布