Como importo módulos globais no Nó? Recebo "Erro: Não é possível encontrar o módulo <módulo>"?


145

Estou tentando configurar o Node no Mac OSX Lion. Tudo parece funcionar bem, mas não consigo importar módulos da minha pasta de módulos globais. Eu recebo o erro

Error: Cannot find module <module>

Se eu executar isso node -e require.paths:, a resposta que recebo é:

[ '/usr/local/lib/node_modules',
  '/Users/Me/.node_modules',
  '/Users/Me/.node_libraries',
  '/usr/local/Cellar/node/0.4.12/lib/node' ]

O que está correto, meus módulos estão realmente instalados em / usr / local / lib / node_modules. Quando tento executar um script, no entanto, estou recebendo o seguinte:

Error: Cannot find module 'socket.io'
    at Function._resolveFilename (module.js:326:11)
    at Function._load (module.js:271:25)
    at require (module.js:355:19)
    at Object.<anonymous> (/Users/Me/node/server.js:2:10)
    at Module._compile (module.js:411:26)
    at Object..js (module.js:417:10)
    at Module.load (module.js:343:31)
    at Function._load (module.js:302:12)
    at Array.<anonymous> (module.js:430:10)
    at EventEmitter._tickCallback (node.js:126:26)

Meu .bash_profile fica assim:

export PATH=/usr/local/mysql/bin:$PATH
export NODE_PATH=/usr/local/lib/node_modules
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/mysql/lib/"

Realmente apreciaria alguma ajuda, não sei por que não consigo importar nenhuma biblioteca.


1
Você sabe que essa não é exatamente a maneira preferida de fazer as coisas, certo?
thejh

1
Você poderia elaborar? Você quer dizer que eu não deveria estar instalando bibliotecas na minha pasta global?
Hanpan

3
@ Hanpan: A maneira preferida é instalar os módulos que você deseja usar via require () localmente.
thejh

1
Uma resposta melhor e mais atualizada (que não depende npm link) pode ser encontrada aqui: stackoverflow.com/a/15646750/2671392
GGG 30/16

1
Eu sou da velha escola e costumava instalar bibliotecas em locais globais. Eu nunca vi nenhuma razão convincente para o uso intenso de instalações de bibliotecas locais. A classe do mongodb que eu estou tendo terminará com algo em torno de cem pequenos projetos quando terminarmos, cada um contendo um conjunto de bibliotecas duplicado - mongodb, express, consolidate etc. A mudança para idiomas interativos deixa depósitos de bibliotecas locais em todo o lugar. Eu devo ter milhares de bibliotecas do Scala nos repositórios locais do Scala. Idem Meteor, groovy e ruby.
Stephen W. Wright

Respostas:


116

Se você estiver usando npm> = 1.0, poderá npm link <global-package>criar um link local para um pacote já instalado globalmente. ( Advertência: o sistema operacional deve oferecer suporte a links simbólicos. )

No entanto, isso não vem sem seus problemas.

O link npm é uma ferramenta de desenvolvimento. É incrível para gerenciar pacotes na sua caixa de desenvolvimento local. Mas implantar com o link npm é basicamente pedir problemas, pois torna super fácil atualizar as coisas sem perceber.

Como alternativa, você pode instalar os pacotes localmente e globalmente.

Para informações adicionais, consulte


69
Estou lendo isso e não consigo acreditar nos meus olhos. Portanto, se eu instalar, digamos express, e depois tiver 20 projetos para construir em cima do express, preciso instalá-lo 20 vezes, para cada um deles, em cada pasta do projeto, repetidamente? Eu não tenho muita experiência com gestores de pacotes, mas isso é uma merda meio que ...
treznik

25
Está correto, e se você pensar bem, faz sentido. O gerenciamento local de suas dependências torna tudo independente e permite que você especifique uma versão específica de uma dependência para um determinado projeto (por exemplo, o projeto foo exige o Express 2.x, enquanto a barra do projeto pode usar o Express 3 Beta).
grahamb

43
Eu lutei para entender a lógica disso por um tempo também, mas depois de assistir meus amigos Ruby lutando com atualizações globais de pacotes, discutir sobre gemsets e muitas vezes simplesmente nunca atualizar, eu admiti que instalar dependências localmente é absolutamente a única maneira sensata de fazer gerenciamento de pacotes .
timoxley

3
Eu gostaria de traçar um paralelo entre essa situação e a das bibliotecas de vinculação estática e dinâmica, no que se refere à distribuição de software. Considere que quase todos os aplicativos distribuídos na iOS App Store devem vincular estaticamente dependências não fornecidas pelo SDK do iOS. Por que isso é feito? O inferno da dependência global é uma coisa muito real.
Steven Lu

1
Também entendo que npmo cache (que reside ~/.npm) facilitará o processo de reinstalação realizado em diferentes locais.
Steven Lu

85

O Node.js usa a variável de ambiente NODE_PATHpara permitir a especificação de diretórios adicionais a serem incluídos no caminho de pesquisa do módulo. Você pode usar- npmse para informar onde os módulos globais estão armazenados com o npm root -gcomando Então, juntando esses dois, você pode garantir que os módulos globais sejam incluídos no seu caminho de pesquisa com o seguinte comando (no Linux-ish)

export NODE_PATH=$(npm root --quiet -g)


3
Obrigado pela NODE_PATHdica da variável de ambiente. Isso ajudou muito!
Rekire

7
Este deve ser o comentário principal #
Adam Prax 11/07

Eu tive que definir NODE_PATHo caminho posix equivalente para fazer o npm funcionar no MSYS2. Obrigado.
Joyce Babu

Também funciona com Windows e Git bash. Perfeito. :-)
inf3rno 14/09/17

Isso torna sua .node_modulespasta pesquisável, mas para importar módulos usando require(), eles ainda devem estar instalados no diretório local do projeto (ou, alternativamente, vinculados usando npm link). Módulos globais não podem ser importados em projetos, apenas binários / scripts podem ser executados a partir daí.
Prahlad Yeri

65

Você pode usar o link npm para criar um link simbólico para o seu pacote global na sua pasta de projetos.

Exemplo:

$ npm install -g express
$ cd [local path]/project
$ npm link express

Tudo o que faz é criar uma pasta node_modules local e, em seguida, criar um link simbólico expresso -> [diretório global] / node_modules / express que pode ser resolvido por require('express')


Este sistema operacional é compatível?
UpTheCreek

Versões mais recentes do Windows apoiá-lo uma vez que esta versão: github.com/npm/npm/commit/... Para versões mais antigas do Windows tentar npmjs.com/package/npm-junction
Alex

22

Instale qualquer pacote globalmente como abaixo:

$ npm install -g replace  // replace is one of the node module.

Como esse módulo de substituição é instalado globalmente, se você vir a pasta de módulos do nó, não verá o módulo de substituição lá e, portanto, não poderá usar este pacote usando require ('replace').

porque with require, você pode usar apenas módulos locais que estão presentes na pasta do módulo do nó.

Agora, para usar o módulo global, você deve vinculá-lo ao caminho do módulo do nó usando o comando abaixo.

$ npm link replace

Agora volte e veja a pasta do módulo do nó, agora você pode ver o módulo de substituição lá e pode usá-lo com require ('replace') em seu aplicativo, pois está vinculado ao seu módulo de nó local.

Por favor, informe-me se for necessário algum esclarecimento adicional.


14

Você pode usar require com o caminho para o diretório global do módulo como argumento.

require('/path/to/global/node_modules/the_module');

No meu mac, eu uso isso:

require('/usr/local/lib/node_modules/the_module');

Como descobrir onde estão seus módulos globais? -> Onde o npm instala pacotes?


7

Configurando a variável de ambiente NODE_PATH para apontar para sua node_modulespasta global .

No Windows 7 ou superior, o caminho é semelhante %AppData%\npm\node_modulesao do UNIX, /home/sg/.npm_global/lib/node_modules/mas depende da configuração do usuário.

O comando npm config get prefixpode ajudar a descobrir qual é o caminho correto.

Nos sistemas UNIX, você pode realizá-lo com o seguinte comando:

export NODE_PATH=`npm config get prefix`/lib/node_modules/

0

Estou usando o Docker. Estou tentando criar uma imagem de janela de encaixe que tenha todas as dependências do meu nó instaladas, mas que possa usar meu diretório de aplicativos local no tempo de execução do contêiner (sem poluí-la com um diretório ou link node_modules). Isso causa problemas nesse cenário. Minha solução alternativa é exigir do caminho exato onde o módulo, por exemplo, require ('/ usr / local / lib / node_modules / socket.io')


-1

require.paths está obsoleto.

Vá para a pasta do seu projeto e digite

npm install socket.io

que deve instalá-lo na pasta local ./node_modules onde o nó irá procurá-lo.

Eu mantenho minhas coisas assim:

cd ~/Sites/
mkdir sweetnodeproject
cd sweetnodeproject
npm install socket.io

Crie um arquivo app.js

// app.js
var socket = require('socket.io')

agora execute meu aplicativo

node app.js

Verifique se você está usando npm >= 1.0e node >= 4.0.


8
Ele está perguntando sobre o uso de pacotes npm instalados globalmente.
UpTheCreek

@Jamund. Você está mostrando como usar o pacote instalado localmente, mas a pergunta original era sobre os globais.
18715 Vitaliy Markitanov
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.