NPM: Папка .bin и исполняемые скрипты

NPM использует информацию из файла package.json для создания и управления исполняемыми скриптами в папке .bin. Рассмотрим этот механизм подробнее.

Создание скриптов и папка .bin

Предполагается, что вы знакомы с созданием и выполнением скриптов в package.json, а также с установкой внешних пакетов (например, npm-run-all). Если скрипт использует внешнюю команду, NPM ищет её исполняемый файл в папке .bin внутри node_modules.

При установке пакета NPM проверяется поле bin в package.json. Если оно содержит пары «ключ-значение», в .bin создаются новые файлы. Например, для npm-run-all создаются npm-run-all и npm-run-all.cmd. Их содержимое копируется из соответствующих файлов установленного пакета (например, npm-run-all содержит содержимое bin/npm-run-all.js). Созданные файлы являются исполняемыми.

Практическое применение: анализ node_modules

Рассмотрим node_modules/npm-run-all. Его package.json содержит три записи в поле bin. Файл bin/npm-run-all.js (расположенный в node_modules/npm-run-all/bin/npm-run-all.js) идентичен файлу npm-run-all в .bin. Это результат инструкций в package.json о копировании файла и создании исполняемого файла npm-run-all в .bin.

Выполнение npm run all успешно. Переименуем npm-run-all в .bin, добавив «2». Повторный запуск npm run all вызовет ошибку из-за отсутствия исполняемого файла. Восстановим исходное имя файла.

Шебанг (Shebang) и исполняемые файлы

Файлы в .bin, например npm-run-all, содержат строку #!/usr/bin/env node (шебанг). Шебанг указывает интерпретатор для выполнения файла. Файлы в .bin не имеют расширения, поэтому шебанг (на Unix-подобных системах) сообщает системе, как их запускать. Каждый файл в .bin — обычный текстовый файл. Для его запуска на Unix-подобных системах необходим шебанг в первой строке.

Удалите шебанг из npm-run-all и запустите npm run all повторно.

Удаление шебанга препятствует запуску исполняемого файла. Создание исполняемых скриптов NPM в .bin определяется полем bin в package.json. Это поле определяет, какие файлы копируются в .bin и становятся исполняемыми.

Что будем искать? Например,программа