Простое симпатичное CLI приложение для Node.JS

Консольное приложение – это удобный способ выполнения повторяющихся задач. Разберем некоторые инструменты, полезные для создания CLI-программ.

Простое CLI приложение для Node.JS

Что будет делать приложение?

При слиянии веток всегда вызывает проблемы файл package-lock.json. Напишем простое демонстрационное приложение для Node.JS, которое будет облегчать работу с git-репозиторием. В его задачи входит удаление проблемного файла, его восстановление с помощью команды npm install и добавление в индекс git.

Вы можете найти готовое приложение здесь. Чтобы его запустить, используйте команду npx fix-package-lock.

Как взаимодействовать с командной строкой?

Чтобы передавать команды в терминал из скрипта, будем использовать пакет execa от Sindre Sohrus, который называют “лучшим child_process”. Для начала работы нужно выполнить команду npm install --save execa.

Файл index.js:

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

Теперь протестируем новый модуль.

>> node index.js
index.js
node_modules
package-lock.json
package.json

Выполнение последовательных действий

Чтобы сгенерировать package-lock, его сначала нужно удалить. После этого необходимо заново установить пакеты с помощью команды npm install.

Для выполнения нескольких действий подряд потребуется модуль Listr. Он позволяет делать нечто подобное:

Простое CLI приложение для Node.JS: модуль Listr

Запустите npm install --save listr и создайте в главном файле последовательность команд.

Содержимое файла index.js:

const execa = require('execa');
const Listr = require('listr');
new Listr([
  {
    title: 'Removing package-lock',
    task: () => execa('rm', ['package-lock.json'])
  },
  {
    title: 'Running npm install',
    task: () => execa('npm', ['install'])
  },
  {
    title: 'Adding package-lock to git',
    task: (ctx, task) =>
        execa('git', ['add', 'package-lock.json'])
        .catch(() => task.skip())
  }
]).run();

Теперь вывод node index.js будет выглядеть следующим образом:

Простое CLI приложение для Node.JS: модуль Listr

Длительные задачи, например, вызов execa для установки npm-пакетов, возвращают Promise. Listr выводит для них состояние выполнения. Также есть возможность отображать сообщение, которое изменяется с помощью Observables. Дополнительную информацию можно найти в документации.

Исполняемые js-файлы

Было бы гораздо удобнее запускать скрипт, используя ./index.js вместо node index.js. Чтобы сделать так, файл должен быть исполняемым. В UNIX системах для этого используется следующая команда:

chmod +x index.js

Теперь нужно сообщить системе, как она должна пытаться запустить файл, с помощью шебанга.

#!/usr/bin/env node

Его нужно добавить в файл index.js:

#!/usr/bin/env node
const execa = require('execa');
const Listr = require('listr');

new Listr([
  {
    title: 'Removing package-lock',
    task: () => execa('rm', ['package-lock.json'])
  },
  {
    title: 'Running npm install',
    task: () => execa('npm', ['install'])
  },
  {
    title: 'Adding package-lock to git',
    task: (ctx, task) =>
        execa('git', ['add', 'package-lock.json'])
        .catch(() => task.skip())
  }
]).run();

Теперь мы можем запускать приложение короткой командой:

./index.js

Создание исполняемого файла

В файле package.json есть поле bin. Оно дает npm команду создать исполняемый файл и установить его в PATH. Добавим эту опцию в наше приложение:

{
  "name": "beautiful-cli",
  "version": "1.0.0",
  "description": "A simple CLI",
  "main": "index.js",
  "bin": {
    "fix-package-json": "./index.js"
  }
  "dependencies": {
    "execa": "^0.10.0",
    "listr": "^0.14.1"
  }
}

Публикация npm-пакета

Публикация модуля остается упражнением для читателя. Используя команду np, сделать это несложно.

Подсказка: просто запустите npx np в любом пакете, который вы пытаетесь опубликовать.

Готовое приложение можно найти здесь. Чтобы запустить его, используйте команду npx fix-package-lock.

Перевод статьи Hugo Di Francesco: How to make beautiful, simple CLI apps with Node.

Комментарии

ВАКАНСИИ

Добавить вакансию
Разработчик C++
Москва, по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ