Estou tentando instalar globalmente e depois usar forever
e forever-monitor
assim:
npm install -g forever forever-monitor
Eu vejo a saída usual e também as operações que copiam os arquivos para o caminho global, mas se eu tentar require("forever");
, recebo um erro dizendo que o módulo não foi encontrado.
Estou usando a versão mais recente do nó e do npm e já sei sobre as alterações que o npm fez na instalação global x local, mas realmente não quero instalar o local em todos os projetos e estou trabalhando em uma plataforma que não suporte link
para que, npm link
após uma instalação global, não seja possível para mim.
Minha pergunta é: por que não posso exigir um pacote instalado globalmente? Isso é um recurso ou um bug? Ou estou fazendo algo errado?
PS: Apenas para esclarecer: não quero instalar localmente.
~/.config/yarn/global
para fiosRespostas:
No Node.js, o require não procura na pasta em que os módulos globais estão instalados.
Você pode corrigir isso configurando a variável de ambiente NODE_PATH. No Linux, será:
Nota: Isso depende de onde seus módulos globais estão realmente instalados.
Consulte: Carregando nas pastas globais .
fonte
export NODE_PATH=/usr/local/lib/node_modules
lugar.NODE_PATH
variável de ambienteC:\Users\{USERNAME}\AppData\Roaming\npm\node_modules
funcione.%AppData%\npm\node_modules
funcionará no Windows 10.NODE_PATH
posso usar módulos globais e locais simultaneamente?NODE_PATH=$(npm root -g)
Depois de instalar o pacote globalmente, você deve vincular o projeto local ao pacote global
Veja aqui
fonte
~/some-stand-alone-random-nodejs-test.js
. Não quero transformar minha pasta pessoal em um diretório de projeto. Não quero criar novas pastas para cada pequena experiência.npm link <module>
Em seguida, você verá um atalho (link) criado na pasta node_module dos seus projetos fazendo referência ao módulo global do nó.Desculpas pela necromancia, mas sou capaz de especificar caminhos codificados para módulos instalados globalmente:
Isso não é perfeito, mas considerando que o Unity3d tenta "compilar" todo o javascript incluído no diretório do projeto, eu realmente não consigo instalar nenhum pacote.
fonte
Eu sei que essa é uma pergunta antiga, mas me deparei com isso ao tentar fazer uma verificação de versão usando
semver
umpreinstall
script nopackage.json
. Como sabia que não podia depender de nenhum módulo local instalado, usei isso para exigirsemver
danode_modules
pasta global (poisnpm
depende disso, sei que está lá):Eu gosto dessa abordagem porque isso não requer a instalação de nenhum módulo especial para ser usado.
Não escolhi uma
NODE_PATH
solução como outras pessoas sugeriram, pois queria que isso funcionasse na máquina de qualquer pessoa, sem precisar exigir configuração adicional antes de executarnpm install
meu projeto.Da maneira como isso é codificado, é garantido encontrar apenas os módulos de nível superior (instalados usando
npm install -g ...
) ou os módulos exigidos pornpm
(listadosdependencies
aqui: https://github.com/npm/npm/blob/master/package.json ). Se você estiver usando uma versão mais recente do NPM, ele poderá encontrar dependências de outros pacotes instalados globalmente, pois há uma estrutura mais plana paranode_modules
pastas.Espero que isso seja útil para alguém.
fonte
De acordo com a documentação , o Node.js procurará nos seguintes locais por padrão:
Caminho especificado na
NODE_PATH
variável de ambiente .Nota:
NODE_PATH
a variável de ambiente está configurada para uma lista delimitada por dois pontos de caminhos absolutos.node_modules
Pasta atual . (local)$HOME/.node_modules
(global)Nota:
$HOME
é o diretório inicial do usuário.$HOME/.node_libraries
(global)$PREFIX/lib/node
(global)Nota: o
$PREFIX
Node.js está configuradonode_prefix
.Para verificar o valor atual de
node_prefix
, execute:Nota: O prefixo corresponde ao
--prefix
parâmetro durante a construção e é relativo aprocess.execPath
. Não confundir com valor donpm config get prefix
comando. fonteSe o módulo fornecido não puder ser encontrado, isso significa que ele não está presente em um dos locais acima.
O local da pasta raiz global onde os módulos estão instalados pode ser impresso por:
npm root -g
(por padrão, o caminho é calculado em tempo de execução, a menos que seja substituído nonpmrc
arquivo ).Solução
Você pode tentar as seguintes soluções alternativas:
Especifique a localização do módulo global na
NODE_PATH
variável de ambiente. Por exemploPara testar e imprimir o valor de
NODE_PATH
, execute:Para uma solução mais permanente, vincule sua
$HOME/.node_modules
pasta de usuário global para apontar para a pasta raiz, executando este comando:Em seguida, teste-o novamente através do
echo 'require("forever")' | node
comando :Altere temporariamente a pasta atual para onde a extensão foi instalada globalmente, antes de chamar o script. Por exemplo
Configure o destino da instalação global no
npm
arquivo userconfig (consulte :)npm help 5 npmrc
ou poruserconfig
param (--prefix
).Para exibir a configuração atual, execute:
npm config list
.Para editar a configuração atual, execute:
npm config edit
.Especifique o caminho completo da localização dos módulos do nó ao chamar
require()
. Por exemploInstale o pacote no local personalizado, por exemplo
No entanto, a instalação será interrompida
~/.node_modules/lib/node_modules/
, portanto o local ainda precisará ser adicionado.Consulte: pacote de instalação local npm no local personalizado
Crie um link simbólico na pasta atual a partir do local do pacote global. Por exemplo
fonte
Você pode usar o pacote
requireg
para resolver este problema:fará o truque.
Além disso, há outro módulo,
global-npm
embora seja específico apenas para usar o globalnpm
, você pode ver o código curto e ver como a técnica funciona.fonte
NODE_PATH
é também que você não precisa alterar nenhum código. (meu caso de uso está classificando muitos projetos de alunos, nos quais não desejo executarnpm install
para cada um e também não quero que eles forneçamnode_modules
diretório).requireg
em primeiro lugar, esse é o ponto.Para utilitários CLI que dependem de grandes módulos,
puppeteer
gosto de gerar umnpm root -g
e usá-lo para exigir o módulo global.fonte
Você pode colocar esta linha no seu
.profile
arquivo:Isso fará
node
uso do caminho global.fonte
node_modules
. Essa é uma resposta antiga, mas lembro que a recebi de algum lugar da documentação. De qualquer forma, no meu computador (em 2020) onode_modules
diretório npm global éusr/lib/node_modules
. De qualquer forma, confionpm config get prefix
porque é usado globalmente pelo npm sempre que um pacote global é instalado, portanto deve estar certo.package.json
arquivo ou emyarn.lock
/package-lock.json
.node_modules
pasta, então é pai, então é pai, ... até encontrar umanode_modules
pasta que contenha esse módulo. No entanto, se você instalar um pacote globalmente, ele não estará em nenhumanode_modules
pasta acima do diretório atual do script e, portanto, você usará NODE_PATH como um fallback em que o nó procurará pacotes.