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