Especifique o caminho para node_modules em package.json


96

Existe uma maneira de mover o diretório node_modules em um aplicativo para, digamos, / vendor / node_modules como o Bower faz com o arquivo bowerrc? Achei que poderia ser especificado em package.json, mas não consigo encontrar uma solução. Sua ajuda é muito apreciada.



@blunderboy obrigado pelo link. É uma loucura que não haja maneira mais fácil de fazer isso. Ah bem.
Esturóide de

27
Não sei por que você aceitou uma resposta que claramente não responde à sua pergunta. Você pergunta como definir o caminho para node_modules inpackage.json , e a resposta do xShirase simplesmente não fornece uma maneira de fazer isso.
Mark Amery

4
Ele provavelmente aceitou a resposta porque este é claramente um problema XY e uma solução alternativa é melhor do que "desculpe, isso não é possível."
Jake Holzinger

Respostas:


58

sim, você pode, basta definir a variável env NODE_PATH:

export NODE_PATH='yourdir'/node_modules

De acordo com o doc:

Se a variável de ambiente NODE_PATH for definida como uma lista delimitada por dois pontos de caminhos absolutos, o nó pesquisará esses caminhos para os módulos se eles não forem encontrados em outro lugar. (Observação: no Windows, NODE_PATH é delimitado por ponto e vírgula em vez de dois pontos.)

Além disso, o nó pesquisará nos seguintes locais:

1: $ HOME / .node_modules

2: $ HOME / .node_libraries

3: $ PREFIX / lib / node

Onde $ HOME é o diretório inicial do usuário e $ PREFIX é o node_prefix configurado do nó.

Principalmente por razões históricas. Você é altamente encorajado a colocar suas dependências localmente nas pastas node_modules. Eles serão carregados com mais rapidez e confiabilidade.

Fonte


1
Isso é ótimo. Portanto, no meu caso onde tenho node_modules locais para cada aplicativo que estou construindo, eu faria essa exportação em um arquivo js no projeto?
Esturóide de

3
não, é uma variável de ambiente, é configurada no nível do sistema. Então você tem que digitá-lo em seu terminal. variáveis ​​env são acessadas em um aplicativo de nó emprocess.env
xShirase

Hmmm parece bom. Terei que investigar mais um pouco. Obrigado pela ajuda.
Esturóide de

114
Eu realmente não acho que essa seja a resposta para a pergunta: ele estava pedindo uma propriedade dentro do package.json para colocar um caminho para LOCAL (nível de aplicativo) npm-Packages. Esta resposta diz a ele como ele pode mover os pacotes GLOBALMENTE (-g) instalados para outra pasta.
David Losert

2
@IsmailIqbal Desculpe, eu vi seu comentário agora mesmo. Já se passaram dois anos no mundo NPM e demos um grande salto com caching, yarn ou mesmo npm5, webpack ... Eu diria que lidar com node_module atualmente é muito melhor. No seu caso, eu simplesmente faria uma "instalação npm" em todos os locais - como o npm armazena em cache os pacotes já instalados, é o mesmo que copiá-lo manualmente sem sobrecarga.
David Losert

28

Resumindo: não é possível e, ao que parece, nunca será suportado (veja aqui https://github.com/npm/npm/issues/775 ).

Existem alguns trabalhos improvisados ​​com o uso de CLI ou ENV-Variables (veja a resposta selecionada), .npmrc-Config-Files ou npm link- o que todos eles têm em comum: Eles nunca são apenas específicos do projeto, mas sempre algum tipo de globalsoluções.

Para mim, nenhuma dessas soluções é realmente limpa porque os contribuidores do seu projeto sempre precisam criar alguma configuração especial ou ter algum conhecimento especial - eles não podem simplesmente npm installe funciona.

Portanto: Ou você terá que colocar seu package.json no mesmo diretório onde deseja que seu node_modules seja instalado, ou conviver com o fato de que eles sempre estarão no diretório-raiz de seu projeto.


16
"Se você quiser soletrar" node_modules "de maneira diferente, desculpe, não posso fazer. Isso está embutido no node-core. Mudar isso é equivalente a construir um gerenciador de pacotes completamente diferente." <== bom trabalho usando variáveis, eu acho.
stevedbrown

1
Um comentário de 2019: parece que o yarn suporta a substituição do diretório de módulos. Bem, yarn é um novo gerenciador de pacotes, suponho.
Vanuan

10

O Yarn é compatível com este recurso:

# .yarnrc file in project root
--modules-folder /node_modules

Mas sua experiência pode variar dependendo de quais pacotes você usa. Não tenho certeza se você gostaria de entrar naquela toca do coelho.


6

Não tenho certeza se é isso que você tinha em mente, mas acabei perguntando porque não consegui instalar node_modulesdentro do meu diretório do projeto, pois ele estava montado em um sistema de arquivos que não suportava links simbólicos (uma pasta VM "compartilhada" )

Encontrei a seguinte solução alternativa:

  1. Copie o package.jsonarquivo para uma pasta temporária em um sistema de arquivos diferente
  2. Corre npm install
  3. Copie o node_modulesdiretório resultante de volta para o diretório do projeto, usando cp -r --dereferencepara expandir os links simbólicos em cópias.

Espero que isso ajude alguém que tenha essa questão ao procurar uma maneira de mudar node_modulespara um sistema de arquivos diferente.

Outras opções

Há outra solução alternativa, que encontrei no problema do github ao qual @Charminbear vinculou , mas não funciona gruntporque não é compatível NODE_PATHcom https://github.com/browserify/resolve/issues/136 :

digamos que você tenha /media/sf_sharede não possa instalar links simbólicos lá, o que significa que você não pode instalar npm /media/sf_shared/myprojectporque alguns módulos usam links simbólicos.

  • $ mkdir /home/dan/myproject && cd /home/dan/myproject
  • $ ln -s /media/sf_shared/myproject/package.json (você pode criar um link simbólico nesta direção, mas não pode criar um dentro de / media / sf_shared)
  • $ npm install
  • $ cd /media/sf_shared/myproject
  • $ NODE_PATH=/home/dan/myproject/node_modules node index.js
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.