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 installlá
  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.