Como posso fazer vários projetos compartilharem o diretório node_modules?


98

Sempre que faço projetos, tenho que baixar todas as dependências dos módulos de nó. Sem copiar os node_modules, há alguma maneira de compartilhar os node_modules centrais em vários projetos?

como os seguintes, tenho que executar muitos comandos todas as vezes ..

npm install gulp-usemin                                                                        
npm install gulp-wrap
npm install gulp-connect
npm install gulp-watch
npm install gulp-minify-css
npm install gulp-uglify
npm install gulp-concat
npm install gulp-less
npm install gulp-rename
npm install gulp-minify-html

3
Você pode instalá-los em um diretório pai comum, se houver. O Node percorrerá os diretórios procurando pelo requiremódulo d. Caso contrário, não, não há uma node_modulespasta "central" oficial para uso com require().
Jonathan Lonowski

Você pode instalar esses pacotes globalmente usando o sinalizador global. Portanto, você não precisa executar comandos de instalação todas as vezes. npm install <npm_package_name> -g
Saba Hassan,

Respostas:


92

Você absolutamente pode compartilhar um diretório node_modules entre projetos.

Da documentação do nó :

Se o identificador do módulo passado para require () não for um módulo nativo e não começar com '/', '../' ou './', então o nó começa no diretório pai do módulo atual e adiciona / node_modules e tenta carregar o módulo a partir desse local.

Se não for encontrado lá, ele será movido para o diretório pai e assim por diante, até que a raiz do sistema de arquivos seja alcançada.

Por exemplo, se o arquivo em '/home/ry/projects/foo.js' chamado de require ('bar.js'), o nó olharia nos seguintes locais, nesta ordem:

/home/ry/projects/node_modules/bar.js /home/ry/node_modules/bar.js /home/node_modules/bar.js /node_modules/bar.js

Portanto, basta colocar uma pasta node_modules dentro do diretório de seus projetos e inserir os módulos que desejar. Exija-os normalmente. Quando o node não encontra um diretório node_modules na pasta do seu projeto, ele verifica a pasta pai automaticamente. Portanto, faça sua estrutura de diretório assim:

-myProjects
--node_modules
--myproject1
---sub-project
--myproject2

Assim, mesmo as dependências do seu subprojeto podem se basear no seu repositório node_modules principal.

Uma desvantagem de fazer isso dessa maneira é que você terá que construir seu arquivo package.json manualmente (a menos que alguém saiba uma maneira de automatizar isso com o grunt ou algo assim). Quando você instala seus pacotes e adiciona o argumento --save a um npm installcomando, ele o anexa automaticamente à seção de dependências ou ao seu package.json, o que é conveniente.


3
Por que isso não é aceito como uma op de resposta? Outra pergunta para @tpie, se alguém estruturar um projeto como você sugeriu, como alguém construiria o package.json para instalar a partir do repositório do módulo pai.
diehell

@diehell Então parece que é "tudo ou nada". Se todas as dependências estiverem em um diretório pai e não houver um diretório node_modules no CWD, o npm verificará o pai e instalará lá, se o encontrar. Se você colocar uma pasta node_modules no diretório, ela será instalada lá.
até

4
Não vejo como o compartilhamento de node_modules pode lidar com diferentes versões de pacote, os pacotes em node_modules não têm versão, ao contrário do npm-cache em c: \ users (Windows), alguém encontrou isso?
cyberguest

Como eu modificaria meu paradigma ao escrever scripts npm e arquivos package.json?
Maddocks

18

Achei um truque, basta dar uma olhada nos links simbólicos (links simbólicos) no Windows ou Linux , está funcionando como um atalho, mas mais poderoso.

Basta criar um arquivo Junctionpara a sua node_modulespasta onde quiser. A junção nada mais é do que um atalho para a pasta node_modules original. Crie-o dentro da pasta do seu projeto onde os node_modules reais teriam sido criados se usados npm install.

Para conseguir isso, você precisa de pelo menos uma node_modulespasta real e, em seguida, faça uma junção nela nos outros projetos.

No Windows, você pode usar o Prompt de Comando ou usar um aplicativo. Usar o prompt de comando dá a você um pouco mais de controle, usar um aplicativo é mais fácil, sugiro Link Shell Extension .


1
Eu cd para dir destino, execute o seguinte comando: mklink /d node_modules (source dir)\node_modules.
ChrisTorng

1
Minha equipe já usa esse método há algum tempo. Embora eu realmente odeie não ter node_modulesa pasta do projeto em si, isso funciona. Só preciso lembrar de navegar até a node_modulespasta real antes de instalar qualquer coisa nova: P
Andrew Craswell

Este método não parece funcionar para mim. Quando eu uso simbólico ou junções, recebo o seguinte erro com node-sass: Falha na construção do módulo: "Erro: Módulo não se auto-registrou" e o erro tem mais detalhes especificando o diretório onde existe o diretório node_modules "compartilhado". Alguma ideia?
flipcode

1
Como evitar remoção de dependência ao executar npm installem qualquer um dos aplicativos "conectados"?
Qwerty

1
mas quando eu executo npm install <new-package>todos os pacotes que não estão no package.json do seu projeto atual são removidos.
Rohit Kaushal,

18

Experimente pnpm em vez de npm.

O pnpm usa links físicos e links simbólicos para salvar uma versão de um módulo apenas uma vez no disco.

Instale com:

npm install -g pnpm

Para atualizar suas instalações existentes (e subdiretórios), use:

pnpm recursive install

Ou use o comando abreviado (deixe -r se você precisar direcionar apenas um diretório)

pnpm -r i

8

O diretório principal deve ser semelhante a este

node_modules
Project 1
Project 2
Project 3
Project 4

apenas abra o arquivo Project 1/.angular-cli.json

mude o esquema

"$schema": "./node_modules/@angular/cli/lib/config/schema.json",

para

"$schema": "./../node_modules/@angular/cli/lib/config/schema.json"

e não se esqueça de criar uma node_modulespasta vazia dentro do diretório do seu projeto


Você é meu herói. Passei uma semana nisso. Muito obrigado!!
Eliezer Berlin

5

Olhando alguns artigos parece que o Lerna é uma boa ferramenta para gerenciar múltiplos projetos dentro de um único diretório ( monorepo). Ele suporta o compartilhamento de módulos sem duplicar os pacotes inteiros em cada pasta e comandos para instalá-los em vários projetos.

O pnpm também é uma ferramenta simples e eficiente, que não duplica os módulos já instalados para outros projetos.



0

Vamos supor que tendo um único node_modules, ele deve conter todos os pacotes para todos os aplicativos. portanto, seus aplicativos também compartilharão a maioria das entradas exclusivas do package.json (apenas o nome deve mudar)

minha ideia seria ter uma única raiz e vários níveis src como abaixo

root\package.json
root\node_modules
root\\..
root\app1\src\\..
root\app2\src\\..

o único problema que você pode enfrentar seria ter um backup de json (ou tsconfig) para qualquer aplicativo e restaurá-los quando você trabalhar nele ou configurar seus scripts de inicialização para servir a qualquer aplicativo

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.