Запуск глобально установленных пакетов npm

может кто-нибудь объяснить, как ведут себя глобально установленные узлы. Это действительно сбивает меня с толку. Если я устанавливаю пакет (с исполняемыми файлами), например http-serverглобально я могу запустить его с:

http-server

но если я это сделаю

node http-server

Я

module.js:339
    throw err;
    ^

Error: Cannot find module '/path/to/current/dir/http-server'
    at Function.Module._resolveFilename (module.js:337:15)
    at Function.Module._load (module.js:287:25)
    at Function.Module.runMain (module.js:457:10)
    at startup (node.js:136:18)
    at node.js:972:3

Я подозреваю, что мой ternпакета emacs пытается запустить его с node отсюда и ломка. Почему это происходит? Почему node не может найти путь к собственным модулям?

4 ответов


rahul@Rahul-Machine:~$ node blalal 
module.js:338
throw err;
^

Error: Cannot find module '/home/rahul/blalal'
at Function.Module._resolveFilename (module.js:336:15)
at Function.Module._load (module.js:286:25)
at Function.Module.runMain (module.js:475:10)
at startup (node.js:117:18)
at node.js:951:3

ooh та же ошибка

это потому, что я первая команда, вы на самом деле пытаетесь получить доступ к глобальной переменной, но во-вторых, вы находитесь где-то в вашей файловой иерархии, и оттуда вы говорите, что хотите получить доступ к этому пакету, поэтому вы ошибаетесь, если хотите выполнить этот глобальный пакет try

whereis http-server

затем перейдите в этот каталог и найдите файл пакета.json, а затем откройте его и найдите свойство "main", и там вы получите имя файла тип

  node index.js

ваш файл будет выполнен


существует два способа установки пакетов:globally и locally.
локально установленные файлы пакетов заканчиваются в вашем локальном node_modules (в папке проекта, куда вы позвонили npm install some-package).
установленные файлы пакетов попадают в вашу систему, поэтому они доступны в командной строке, если глобально установленные пакеты предоставляют исполняемый файл, то вы можете вызвать его в командной строке напрямую some-package(без node), если он не предоставляет исполняемый файл, то вы можете использовать его в режиме расх (node) как var package = require('some-package') и он также доступен локально (внутри папку вашего проекта, даже если вы не установили его на месте).


это началось как комментарий, но теперь немного дольше.

проблема не совсем node не найти глобальные пакеты,node только поиск пакетов в текущем местоположении (например, в разделеnode_modules), и это намеренно. Глобально установленные пакеты можно запускать из команды, например, из-за way npm устанавливает их, и это то, что делает глобальные пакеты особенными в некотором роде.

в системах на базе Unix npm создает мягкие ссылки на основные исполняемые файлы глобально установленных пакетов, например http-server в папке, в пути к исполняемому файлу. На моей машине, это /usr/local/bin/. Вот почему эти команды могут быть вызваны из командной строки без указания полного пути.

в Windows npm создает исполняемый пакетный файл с именем, например http-server.cmd под %APPDATA% (обычно что-то вроде C:\Users\YourUserName\AppData\Roaming). Пакетный файл содержит инструкции по запуску целевого исполняемого файла из того места, где он находится на самом деле установленный.


когда вы устанавливаете что-то глобально, вы сохраняете переменную с сохраненным путем, связанным с ней, а также с программой выполнения. В то время как ваша операционная система будет знать, как получить к нему доступ. Узел не будет. Если вы хотите " что-то узловое.js " вы либо находитесь в каталоге, либо настраиваете свой путь так, чтобы узел знал, как добраться до файла. например,узел "c:/jsapps/main/app.js" или если вы были в позволяет сказать папку "jsapps" вы бы ввести узел " main / app.js" для выполнения того же файла.