В чём ошибка при создании своей 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 шт):

Автор решения: Alexander Lonberg

Предлагаю сделать так. В package.json дописываем такую маленькую вещь:

"dependencies": {
    "@types/node": "^14.14.0",
    "@typescript-eslint/parser": "^4.22.0",
    "typescript": "^4.2.0",
    +++
    "pkg": "./"
  }

И выполняем команду

npm i

У меня это точно всегда работает.

Вот ваш пример с коровой

введите сюда описание изображения

И вот выполнение нашей команды

введите сюда описание изображения

Все работает !!!

→ Ссылка
Автор решения: return

Это о-очень интересная ошибка: нужно было просто почистить кэш.

Полазив в 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, да репозиторий архивирован.

→ Ссылка