#nodejs #npm #node_modules
Интересует, как создаются такие 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-пакет, который будет иметь возможность запускаться прямо из терминала по своему имени? Подробности описаны выше.
Ответы
Ответ 1
За это отвечает секция 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.Ответ 2
Вот пример такого пакета package.json { "name": "myscript", "version": "0.0.1", "description": "Do nothing", "license": "MIT", "preferGlobal": true, "bin": { "myscript": "index.js" } } preferGlobal указывает, что это пакет преимущественно запускается в командной строке и его надо установить глобально - ключ -g, если устанавливать без этого ключа, то будет выдано предупреждение. bin указывает какой будет создан symlink. Ключ - это имя symlink (вашей команды, express, например), а значение - это файл, на который этот symlink указывает. В случае с express-generator там будет "bin":{"express":"./bin/express-cli.js"} index.js Первая строчка указывает как именно запускать этот файл. #!/usr/bin/env node console.log('Script is running'); index.js нужно сделать исполняемым chmod +x index.js Для проверки этого пакета в процессе разработки необходимо выполнить вот эту команду. npm link И вы получите возможность запускать myscript в терминале. После публикации пакета в npmjs он будет работать как все остальные пакеты.
Комментариев нет:
Отправить комментарий