В чём ошибка при создании своей npx библиотеки
Мне потребовалось создать свою npx библиотеку. Всё работает хорошо... Но только с заранее установленным пакетом:
npm i -g pkg
npx pkg some args
Если же просто ввести npx pkg some args, в духе npx create-react-app, то просит установить пакет, а потом выбрасывает ошибку:
"pkg" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
lib/index.js
#!/usr/bin/env node
console.log(process.argv.slice(2).join(' ')); // упрощено до предела, т.к. сам код рабочий
package.json
{
// name, version, description, keywords и проч. сгенерированы анкеткой
"main": "lib/index.js"
"bin": {
"pkg": "lib/index.js" // сюда можно хоть `abrakadabra` вставить: всё равно не работает
},
"scripts": {
// build скрипты
"prepare": "del /q lib && npm run build",
"prestart": "npm run build",
"start": "node lib/index"
},
"dependencies": {
"@types/node": "^14.14.0",
"@typescript-eslint/parser": "^4.22.0",
"typescript": "^4.2.0"
}
}
Я смотрел на др. репозитории, как сам create-react-app и cowsay, но не нашёл каких-либо кардинальных отличий.
Собственно, вопрос: как исправить это недоразумение
Я пишу на Windows, #!usr/bin/env выглядит как какая-то юниксовская тема, может в этом дело?
Ответы (2 шт):
Предлагаю сделать так. В package.json дописываем такую маленькую вещь:
"dependencies": {
"@types/node": "^14.14.0",
"@typescript-eslint/parser": "^4.22.0",
"typescript": "^4.2.0",
+++
"pkg": "./"
}
И выполняем команду
npm i
У меня это точно всегда работает.
Вот ваш пример с коровой
И вот выполнение нашей команды
Все работает !!!
Это о-очень интересная ошибка: нужно было просто почистить кэш.
Полазив в source коде npx я понял, что кэш в приоритете и не важно, обновилась версия или нет. Я зашёл в свой кэш (чтобы узнать кэш выполните npm config get cache (об этом я тоже узнал из source кода)) и там были папки с именами PID в hex моих процессов, которыми я устанавливал пакеты (понятно, откуда я об этом узнал). Там были и create-react-app, и cowsay, и мой pkg, в котором я в файле package.json не указал bin, из-за чего соответствующая папка не появилась, из-за чего cmd.exe не может найти executable, из-за чего он и выбрасывает мне эту странную ошибку. Почистив кэш, я вынудил npx установить пакет заново — теперь-то оно работает.
Более коротко. В старой версии pkg я не указал bin, таким он сохранился в кэш и не хотел оттуда вылазить даже при обновлении версии, а кэш у npx в приоритете. Пришлось его оттуда выгонять силой (с помощью Shift+Delete).
И не надо ничего менять в package.json, не надо никаких ярлыков, никаких самодобавлений в dependencies, нужно было просто почистить кэш. А то, что он не обновляется, я считаю явным багом. Я бы написал issue, да репозиторий архивирован.

