Как создать инструмент командной строки с помощью NPM

Задний план:

Я всегда хотел создать свой собственный интерфейс командной строки, но я никогда не мог понять, как вообще начать. Наконец, однако, с небольшой помощью из статей, которые я перечислю ниже, я сделал удобный интерфейс командной строки NPM под названием html-init, который позволяет вам создать новый базовый файл HTML в рабочем каталоге командной строки по указанному пути. пользователем. Если вы не знакомы с этими терминами, это в основном означает, что вы можете запустить код

html-init path/to/file.html

в командной строке (или терминале, как бы вы это ни называли), и он создаст этот файл в любом каталоге (папке), в котором вы находитесь, с некоторым базовым начальным HTML.

В этой статье вы узнаете, как создать инструмент командной строки с такими же функциями.

Как:

Наконец-то я нашел отличный ресурс на JavaScriptPlayground.com, в котором рассказывалось, как создать базовый интерфейс командной строки NPM. Хотя это было очень полезно и, наконец, дало мне отправную точку, оно все же содержало несколько технических терминов. В оставшейся части этой статьи я постараюсь объяснить все понятно.

Сначала запустите npm init и введите информацию о пакете. Вы можете просто нажать Enter несколько раз, чтобы получить пакет по умолчанию, или вы можете заполнить поля.

Затем отредактируйте файл package.json, чтобы он выглядел следующим образом:

{
  "name": "whatever-you-want-to-call-it",
  "version": "1.0.0",
  "description": "A simple CLI tool allowing you to create a basic HTML file",
  "main": "index.js",
  "keywords": [
    "html"
  ],
  "author": "Your name",
  "license": "ISC",
  "preferGlobal": true,
  "bin": {
    "html-init": "index.js"
  },
  "dependencies": {
    "fs-extra": "^4.0.2"
  },
}

preferGlobal имеет значение true, потому что он предназначен для глобальной установки (это означает, что пакет npm не просто установлен в одном репозитории, поэтому пользователь может получить к нему доступ из любого места на компьютере). Если кто-то попытается установить ваш модуль без --global тег, они получат предупреждение о том, что он предназначен для глобальной установки.

См. также:  Fairmodels: давайте бороться с предвзятыми моделями машинного обучения (часть 2 - визуализация)

Вы также заметите, что под bin есть следующий код:

"html-init": "index.js"

Это чрезвычайноважно. Это означает, что когда пользователь запускает html-init через командную строку, запускается index.js. ЭТО БАЗОВАЯ НАСТРОЙКА для нашего инструмента командной строки. Конечно, html-init можно заменить на любое другое имя скрипта, и то же самое с index.js.

Осталось сделать только одно, чтобы ваш модуль заработал: отредактируйте файл index.js. Мой файл выглядит так:

#! /usr/bin/env node
const fse = require('fs-extra');//Require the fs-extra module for file modification
var basicHTML = `
<!DOCTYPE html>
  <html>
    <head>
      <title>Title</title>
    </head>
    <body>
    </body>
  </html>
`;//Set what you want your basic HTML document to look like
const file = process.cwd() + "/" + process.argv[2];

fse.outputFile(file, basicHTML)//Output file at filepath with basic HTML Content
.then(() => fse.readFile(file, 'utf8'))
.then(data => {
  console.log(data) //console.log(process.argv[2] + " created with content : " + data)
})
.catch(err => {//If there's an error, log the error
  console.error(err)
})

Верхняя линия, которую иногда называют «линией шебанга», просто должна быть — не беспокойтесь об этом прямо сейчас. Вы заметите, что я требую fs-extra . Это чрезвычайно полезный модуль NPM для редактирования/создания файлов.

process.argv — это массив, содержащий все аргументы командной строки, переданные в index.js. Первые 2 аргумента не имеют значения, просто посмотрите на последующие. process.argv[2] содержит параметр сразу после вызова html-init. Итак, если я наберу html-init index.html, process.argv[2] будет равно index.html.

process.cwd() получает каталог, в котором вы находитесь, в командной строке. Итак, если ваша командная строка выглядит так: C:/Users/username> (это на компьютере с Windows), то это то, что будет оцениваться process.cwd().

Остальной код довольно прост. var basicHTML устанавливается в литерал шаблона, содержащий содержимое базового HTML-файла. Не беспокойтесь, если вы не знаете, что это такое, просто относитесь к нему как к строке.

См. также:  Как создать пакет библиотеки стилизованных компонентов для работы с Gatsby

const file = process.cwd() + “/" + process.argv[2] устанавливает путь к текущему рабочему каталогу плюс путь к файлу, который указан в аргументе после html-init (или любой другой команды, которую вы выберете).

Затем мы используем fse (это то, что мне нужно, но не забудьте вызвать функцию с любым именем, которое вам нужно), чтобы вывести содержимое basicHTML в file (куда мы хотим, чтобы документ попал).

Теперь у вас есть инструмент командной строки! Имейте в виду: при выводе с помощью fs-extra он перезапишет данные файла, если этот файл существует, или создаст новый файл. Будь осторожен!

Чтобы протестировать свой инструмент, создайте новый каталог, перейдите в него и запустите html-init index.html . Затем откройте index.html в своем любимом текстовом редакторе (рекомендую Light Table), и он должен иметь базовый HTML-контент!

Следующие шаги:

Поиграйте с кодом! Помните, что вы можете передать несколько аргументов с помощью process.argv[3] или process.argv[4] и т. д.! Проявите творческий подход! Если вы хотите посмотреть на мой текущий код, вы можете найти его здесь.

Ресурсы:

 

Написание инструментов командной строки с помощью Node
Ещё в августе 2012 года я написал пост о создании инструмента командной строки в NodeJS. Этому сообщению уже больше двух лет, и…javascriptplayground.com

 

 

Процесс | Документация по Node.js v8.6.0
Предупреждение о процессе похоже на ошибку в том смысле, что оно описывает исключительные условия, с которыми сталкивается пользователь…nodejs.org

 

Понравилась статья? Поделиться с друзьями:
IT Шеф
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: