Установите локально разработанный пакет npm по всему миру

Я разрабатываю пакет узлов, который нужно запустить из оболочки. Я знаю, что мне нужно установить пакет по всему миру, но

$> npm install -g ./my_module

Не дает мне желаемого результата, который работает

$> my_module

Результаты в

my_module: : command not found

Вместо запуска точки входа (index.js) моего пакета узла.

Я чувствую, что мне не хватает чего-то очевидного здесь, что я делаю неправильно?

Ответ 1

Пожалуйста, попробуйте упаковать модуль и установить.

npm pack

а затем установить его глобально

npm i -g my_module-0.0.1.tgz

Дайте мне знать, это сработало или нет

Ответ 2

Я недавно столкнулся с той же проблемой. Я разработал свой модуль как CLI с намерением вызывать его из любого места, опубликовал его в реестре MPM и установил его, используя -g но при вызове из командной строки я все еще получал command not found ошибка. Добавление атрибута bin в файл package.json - вот что сработало.

Из документации НПМ:

Многие пакеты имеют один или несколько исполняемых файлов, которые они хотели бы установить в PATH. npm делает это довольно легко (фактически, он использует эту функцию для установки исполняемого файла npm).

Чтобы использовать это, укажите поле bin в вашем package.json, который представляет собой карту имени команды с локальным именем файла. При установке npm будет ссылаться на этот файл в prefix/bin для глобальной установки или ./node_modules/.bin/ для локальной установки.

То есть ваш файл package.json должен выглядеть так:

{
    "name": "foo-cli",
    "version": "1.0.0",
    "description": "A CLI to do Foo-ish things.",
    "bin": {
        "foo": "./cli.js"
    },
    "main": "main.js",
    ...
}

Свойство может быть одной строкой, если вы хотите указать только одну команду, или картой, если вы хотите указать много. Теперь вы должны иметь возможность вызывать foo из любой точки командной строки.

Ответ 3

После настройки правильной конфигурации package.json (в основном с использованием {"bin": {...}}) Вам не нужно публиковать ее в реестре NPM, а затем снова загрузить, чтобы увидеть, как она работает.

npm link сделана именно для этой ситуации. как описано в официальной документации:

npm link в папке пакета создаст символическую ссылку в глобальной папке {префикс}/lib/node_modules/, которая ссылается на пакет, в котором была выполнена команда npm link.

Предполагая, что у вас есть этот проект:

-- my_module

-- -- index.js
-- -- cli.js
-- -- package.json

и у вас есть этот package.json:

{
  "name": "my_module",
  "preferGlobal": true,
  "bin": {
    "my_module": "cli.js"
  },
}

Бежать:

cd my_module

Затем:

npm link

Теперь npm установит ваш пакет глобально на вашем компьютере. он проверит package.json для записи в bin и свяжет my_module с файлом cli.js Это произойдет путем создания символической ссылки в глобальном каталоге npm на ваш текущий каталог.

Теперь, если вы запускаете в командной строке:

my_module

он будет указывать на файл cli.js если вы изменили содержимое cli.js, это будет отражено при следующем запуске my_module, если вы переименовали my_module в my_module2, используйте npm unlink затем npm link снова.


С другой стороны, npm может использовать полный URL-адрес в качестве имени пакета, он будет использовать полный URL-адрес для загрузки и установки пакета, вместо просмотра реестра npm, вы можете устанавливать пакеты с собственных частных хостов Git, например:

npm install -g https://github.com/Me/my_module