Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Как создать npm-пакет, который будет иметь возможность запускаться прямо из терминала по своему имени?

#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 он будет работать как все остальные пакеты.

Комментариев нет:

Отправить комментарий