Консольная команда CLI Node.js

Реализуем консольную команду в отдельном пакете.

Основа

mkdir test-cli && cd test-cli
npm init --yes

Добавить поддержку ES-модулей

npm install esm

src/cli.js — Точка входа для выполнения консольного файла

export function cli(args) {
 console.log(args);
}

bin/test-cli.js — Код который будет прописан в разделе bin в package.json

#!/usr/bin/env node

require = require('esm')(module /*, options*/);
require('../src/cli').cli(process.argv);

Добавил раздел `bin` в package.json

"bin": {
  "test-cli": "bin/test-cli.js"
},

В общем виде это будет примерно так

{
  "name": "test-cli",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "bin": {
     "test-cli": "bin/test-cli.js"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "esm": "^3.2.25"
  }

Для того что бы на данном этапе создать команду test-cli выполните

npm link

Она создать симлин в /usr/local/bin/test-cli на раздел скрипт указанный в bin.
После чего вам будет доступна команда test-cli

Для того что бы удалить эту команды выполните

npm unlink

Разбор командной строки

Самый простейший способ получить параметры:

args.slice(2)

Если хотим усложнить то выбираем пакеты:

Далее пример будет с использованием yargs. Выполним его установку

npm install yargs

Теперь открываем src/cli.js и добавляем обработку ключа --test

const yargs = require('yargs/yargs')
const { hideBin } = require('yargs/helpers')

export function cli(args) {
    const argv = yargs(hideBin(args)).argv;
    console.log(argv.test);
}

yargs позволяет описать параметры которые будут затем видны через ключ --help
Пример

const yargs = require('yargs/yargs')
const { hideBin } = require('yargs/helpers')

export function cli(args) {
    const argv = yargs(hideBin(args))
        .command('Описание команды')
        .option('verbose', {
            alias: 'v',
            type: 'boolean',
            default: false,
            description: 'Булевый параметр'
        })
        .option('port', {
            alias: 'p',
            type: 'int',
            default: 3000,
            description: 'Числовой параметр'
        })
        .option('test', {
            alias: 't',
            type: 'string',
            description: 'Обязательный параметр',
            demandOption: true
        })
        .parse();

    console.log(argv)
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *