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

0
10707

Консольное приложение – это удобный способ выполнения повторяющихся задач. Разберем некоторые инструменты, полезные для создания 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.

РУБРИКИ В СТАТЬЕ

МЕРОПРИЯТИЯ

Комментарии 0

ВАКАНСИИ

Unity3D Developer
по итогам собеседования
Ведущий программист Unity3D
Москва, по итогам собеседования
Tableau developer
по итогам собеседования
Middle\Senior .Net разработчик
от 120000 RUB до 165000 RUB

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

BUG