Интересует, как создаются такие npm-пакеты, которые в дальнейшем можно вызывать прямо из терминала?
Например, при установке пакета express-generator, в папку, где лежит бинарник node'а и npm'а (например ~/.local/bin/node/bin/) добавляется ссылка на ../lib/node_modules/[package]/bin/. То есть, поскольку путь к node'у лежит в переменной окружения $PATH, то и к этому пакету тоже теперь есть доступ прямо из терминала. Я могу просто написать express и этот файл начнет выполняться ('~/.local/bin/node/lib/node_modules/express-generator/bin/express-cli.js`).
Что удивляет еще больше, так это 2 другие вещи: почему пакет называется express-generator, а запускается он командой express? И почему этот файл является обычным .js файлом, но запускается из терминала как ни в чем не бывало? Где-то неявно указывается его открытие через Node?
В общем, интересует, как можно создать подобного рода пакет, чтобы сразу при его установке добавлялась ссылка на .js файл в путь к node'у, чтобы мой пакет можно было запустить прямо из терминала.
Благодарю.
P.S. Если где-то путаю термины, то прошу меня поправить, ибо только начинаю разбираться во всей этой каше.
По просьбе "сформулировать вопрос более точно".
Как создать npm-пакет, который будет иметь возможность запускаться прямо из терминала по своему имени? Подробности описаны выше.
Ответ
За это отвечает секция bin в package.json:
"bin": {
"mytool": "bin/tool.js"
}
tool.js, в свою очередь, должен содержать так называемый шебанг -
#!/usr/bin/env node, например.
При установке такого пакета, в node_modules/.bin появится исполняемый бинарник mytool. Точнее симлинк mytool -> ../yourpackage/bin/tool.js.
Запускать локально установленные утилиты можно как $(npm bin)/mytool
При установке пакета с -g он попадёт в глобальный node_modules/.bin, который присутствует в $PATH. Тогда его можно вызывать просто, как mytool
Комментариев нет:
Отправить комментарий