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 и становятся исполняемыми.