Eu me deparei com um problema curioso - aparentemente, alguns módulos Node.js têm hierarquias de pasta tão profundas que o comando de cópia do Windows (ou do PowerShell, Copy-Item
que é o que estamos realmente usando) atinge o erro infame "caminho muito longo" quando o caminho está acima de 250 chars long.
Por exemplo, esta é uma hierarquia de pastas que um único módulo Node pode criar:
node_modules\nodemailer\node_modules\simplesmtp\node_modules\
xoauth2\node_modules\request\node_modules\form-data\node_modules\
combined-stream\node_modules\delayed-stream\...
Parece loucura, mas é uma realidade com os módulos do Node.
Precisamos usar copiar e colar durante a implantação (não estamos usando uma plataforma de destino "inteligente" como Heroku, onde a implantação do Git seria uma opção) e essa é uma limitação séria no Windows.
Não existe um comando npm ou algo que compactaria a node_modules
pasta ou talvez incluísse apenas o que é realmente necessário em tempo de execução? (Módulos de nó geralmente contêm test
pastas etc. que não precisamos implantar.) Alguma outra ideia de como contornar isso? Não usar o Windows, infelizmente, não é uma opção :)
package.json
comdependencies
? Em caso afirmativo, você poderia copiar semnode_modules
e usar o npm parainstall
ouupdate
nas dependências?npm install
no ambiente de destino, ele funciona criando um "pacote de implantação" localmente (basicamente um ZIP mais alguns metadados) que é então carregado para a máquina de destino, extraído lá e pronto. Portanto, preciso incluirnode_modules
diretamente.Respostas:
O npm v3 (lançado recentemente) resolve esse problema simplificando as dependências. Verifique as notas de versão aqui em https://github.com/npm/npm/releases/tag/v3.0.0 na
flat flat
seção.E o último comentário sobre este assunto https://github.com/npm/npm/issues/3697
fonte
flat flat
agora estão enterradas em outra página. Aqui está um link direto: github.com/npm/npm/releases/tag/v3.0.0só para adicionar a isso ... outra coisa que me ajudou foi listar todos os módulos instalados com
npm ls
.que vai te dar uma árvore de módulos e versões ... a partir daí é muito fácil identificar quais são duplicatas ...
npm dedupe
não fez nada para mim. Não tenho certeza se isso é um bug ou o quê (Nó v 10.16)Portanto, depois de identificar um módulo duplicado, instale-o no diretório root node_module usando
npm install [email protected] --save-dev
. A versão é importante.depois disso, limpei meu diretório node_modules e fiz um novo
npm install
.Versão curta
npm ls
para obter uma lista de todos os módulos instalados.npm install module@version --save-dev
para instalar esses módulos no diretório root node_modules e atualizar o package.json.rmdir node_modules
para excluir o diretório node_modules.npm install
para obter uma nova cópia de suas dependências.Depois de fazer isso, tudo ficou muito mais limpo.
Também recomendo comentar seu arquivo package.json para mostrar quais foram reduzidos para nivelar a árvore node_modules.
fonte
Não acho que haja uma grande solução, dadas as suas restrições, mas aqui estão algumas coisas que podem ajudar.
npm dedupe
para otimizar sua hierarquia de diretório, o que pode encurtar alguns caminhosnpm install --production
para instalar sem as ferramentas de desenvolvimentonode_modules
diretório mais alto abaixo, oyour_project/node_modules/pkg_with_deep_deps
que permitirá que tenham caminhos curtos o suficiente, mas ainda funcionem. Então isso seriayour_project/node_modules/pkg_with_deep_deps/node_modules
.require
deve ser capaz de encontrar esses corretamente em tempo de execução. Você só precisará documentar claramente o que alterou manualmente, por que o fez e manter suas próprias dependências verdadeiras representadas com precisão empackage.json
Aqui está uma discussão sobre o problema do github que aborda esse problema em detalhes.
fonte
dedupe
(não sabia sobre isso) e--production
(npm install -h
não mostrei essa opção)! Usar um arquivo ZIP infelizmente não é uma opção, veja um comentário acima.Eu escrevi um módulo de nó chamado "npm-flatten" que nivela suas dependências para você aqui: https://www.npmjs.org/package/npm-flatten
Se você está procurando uma distrubção, também escrevi um pacote NuGet que integrará um ambiente node.js completo com seu projeto .NET aqui: http://www.nuget.org/packages/NodeEnv/
O feedback seria bem-vindo.
fonte
Algo que me ajudou foi mapear uma unidade local para minha pasta Node.js:
net use n: \ computername \ c $ \ users \ myname \ documents \ node.js / persistent: yes
Antes: c: \ users \ myname \ documents \ node.js \ projectname (45 caracteres) Depois: n: \ projectname (14 caracteres, que são 31 caracteres a menos)
Em muitos casos, isso permitiu a instalação de alguns módulos.
Direi que redescobri esse problema hoje, quando estava tentando fazer backup de todo o meu código em uma unidade USB.
"C: \ Users \ myname \ Documents \ Node.js \ angular-phonecat \ node_modules \ karma \ node_modules \ chokidar \ node_modules \ anymatch \ node_modules \ micromatch \ node_modules \ regex-cache \ node_modules \ benchmarked \ node_modules \ file-reader \ node_modules \ extend-shallow \ benchmark \ fixtures é muito longo. "
Mesmo quando tentei fazer backup deles usando a letra da unidade N: ainda falhou em alguns casos devido ao comprimento do caminho, mas foi apenas o suficiente para corrigir o acima.
fonte
1) Durante o lançamento do build, você pode evitar que o Visual Studio escaneie esses arquivos / pasta, definindo as propriedades da pasta como uma pasta Oculta (apenas defina-a como node_modules). Referência: http://issues.umbraco.org/issue/U4-6219#comment=67-19103
2) Você pode excluir arquivos ou pastas que são publicados durante o empacotamento, incluindo o nó XML a seguir no arquivo CsProject.
fonte
Eu encontrei uma solução de Diretrizes Microsoft Node.js .
> npm install -g rimraf
apagar arquivos que excedammax_path
> npm dedupe
move pacotes duplicados para o nível superior> npm install -g flatten-packages
move todos os pacotes para o nível superior, mas pode causar problemas de versãonpm@3
qual tenta tornar anode_modules
hierarquia da pasta maximamente plana.> npm install –g npm-windows-upgrade
fonte
Esta não é uma solução adequada, e sim uma solução alternativa quando você está com pressa, mas você pode usar o 7-Zip para compactar sua pasta, mover o arquivo compactado e descompactá-lo sem nenhum problema.
Usamos essa solução para implantar um aplicativo Node.js onde não era possível fazer uma instalação limpa do npm.
fonte