Реализуем консольную команду в отдельном пакете.
Основа
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)
}