如何在Windows上部署具有深度node_modules结构的Node.js应用程序?

Bor*_*ard 91 windows deployment filenames node.js npm

我遇到了一个奇怪的问题 - 显然有些Node.js模块有如此深的文件夹层次结构,当Windows Copy-Item路径超过250时,Windows复制命令(或我们实际使用的PowerShell )会遇到臭名昭着的"路径太长"错误chars long.

例如,这是单个Node模块可以创建的文件夹层次结构:

node_modules\nodemailer\node_modules\simplesmtp\node_modules\
xoauth2\node_modules\request\node_modules\form-data\node_modules\
combined-stream\node_modules\delayed-stream\...
Run Code Online (Sandbox Code Playgroud)

看起来很疯狂但是Node模块已经成为现实.

我们需要在部署期间使用复制粘贴(我们不使用像Heroku这样的"聪明"目标平台,其中Git部署是一个选项),这是对Windows的严重限制.

是不是有npm命令或者压缩node_modules文件夹的东西,或者只包含运行时实际需要的东西?(节点模块通常包含test我们不需要部署的文件夹等.)任何其他想法如何解决它?遗憾的是,不使用Windows不是一个选项:)

Ben*_*esh 62

只是为了增加这个...帮助我的另一件事是列出所有已安装的模块npm ls.

这将给你一个模块和版本的树...从那里很容易识别哪些是重复... npm dedupe没有为我做任何事情.我不确定这是一个错误还是什么(Node v 10.16)

因此,一旦确定了重复的模块,就可以使用它将其安装到根node_module目录中npm install dupemodule@1.2.3 --save-dev.版本很重要.

之后,我清除了我的node_modules目录并重新开始了npm install.

精简版

  1. npm ls 获取所有已安装模块的列表.
  2. 查看这些模块并识别重复的模块(版本很重要)
  3. npm install module@version --save-dev 在根node_modules目录中安装这些模块并更新package.json.
  4. rmdir node_modules 删除node_modules目录.
  5. npm install 下拉依赖项的新副本.

一旦我这样做,一切都更清洁.

我还建议您对package.json文件进行注释,以显示哪些文件被压缩以展平node_modules树.

  • 无论如何,谢谢你的提示.我刚刚从我们的项目中删除了大约1700个重复文件.删除东西是我最喜欢的开发人员!此外,对于任何想要如何添加评论到package.json的人,这是你的答案:http://stackoverflow.com/questions/14221579/how-do-i-add-comments-to-package-json-for-npm -安装 (7认同)
  • @Caleb可能是因为不同的模块依赖于同一模块的不同版本,或者可能只是因为它更容易获得所需的任何东西,*然后*将其降低...我不知道. (2认同)

Pet*_*ons 38

鉴于你的限制,我认为没有任何好的解决方案,但这里有一些可能有所帮助的事情.

  • 尝试使用npm dedupe优化目录层次结构,这可能会缩短某些路径
  • 用于npm install --production在没有开发工具的情况下安装
  • 采取一些深度嵌套的依赖项(足以避免问题,我建议)并将它们移动到顶级node_modules目录.只需跟踪它们就可以了解哪些是您真正的依赖项,哪些是此问题的解决方法.
  • 或者将这些深度依赖项中的一些移动到最高node_modules目录下your_project/node_modules/pkg_with_deep_deps,这将允许它们具有足够短的路径但仍然有效.所以这就是your_project/node_modules/pkg_with_deep_deps/node_modules.
    • 我认为require应该能够在运行时正确找到它们.您只需要清楚地记录您手动更改的内容,为什么要这样做,并保持您自己的真实依赖关系准确地表示在package.json

这是一个github问题讨论,详细阐述了这个问题.

  • npm重复数据删除只会将"常用"模块展平到层次结构中的最低公共位置.还不够好.一个适当的解决方案将允许"强制平坦"整个层次结构,并可能允许忽略test/doc目录.另一种方法是节点直接从tar文件支持读取模块. (9认同)
  • 同意,某种类型的"二进制"软件包分发(ZIP,tarball,等等)将非常有用. (3认同)

Ram*_*Vel 24

NPM V3(最近发布)的不上不下的依赖关系.检查发行说明在这里解决了这个问题https://github.com/npm/npm/releases/tag/v3.0.0flat flat部分.

关于这个问题的最后评论https://github.com/npm/npm/issues/3697

  • "flat flat"的发行说明现在被埋在另一页中.这是一个直接链接:https://github.com/npm/npm/releases/tag/v3.0.0 (5认同)

小智 11

我写了一个名为"npm-flatten"的节点模块,它可以在这里展示你的依赖关系:https://www.npmjs.org/package/npm-flatten

如果您正在寻找distrubtion,我还编写了一个NuGet包,它将在这里将完整的node.js环境与您的.NET项目集成:http://www.nuget.org/packages/NodeEnv/

反馈将是受欢迎的.