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

How to deploy Node.js application with deep node_modules structure on Windows?

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

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

1
2
3
4
5
6
7
8
9
10
11
node_modules
odemailer
ode_modules\simplesmtp
ode_modules\
xoauth2
ode_modules
equest
ode_modules\form-data
ode_modules\
combined-stream
ode_modules\delayed-stream\...

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

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

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


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

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

因此,一旦确定了重复的模块,就可以使用npm install [email protected] --save-dev将其安装到根node_module目录中。版本很重要。

之后,我清除了我的node_modules目录并执行了新的npm install

精简版

  • npm ls获取所有已安装模块的列表。
  • 查看这些模块并识别重复的模块(版本很重要)
  • npm install module@version --save-dev将这些模块安装在根node_modules目录中并更新package.json。
  • rmdir node_modules删除node_modules目录。
  • npm install以下载依赖项的新副本。
  • 一旦我这样做,一切都更清洁。

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


    鉴于你的约束,我认为没有任何好的解决方案,但这里有一些可能有用的东西。

    • 尝试使用npm dedupe来优化目录层次结构,这可能会缩短某些路径
    • 在没有开发工具的情况下使用npm install --production进行安装
    • 采取一些深度嵌套的依赖项(足以避免问题,我建议)并将它们移动到顶级node_modules目录。只需跟踪它们就可以了解哪些是您真正的依赖项,哪些是此问题的解决方法。
    • 或者将一些深度依赖项移动到your_project/node_modules/pkg_with_deep_deps下的最高node_modules目录,这将允许它们具有足够短的路径但仍然有效。所以这将是your_project/node_modules/pkg_with_deep_deps/node_modules

      • 我认为require应该能够在运行时正确找到它们。您只需要清楚地记录您手动更改的内容,为什么要这样做,并在package.json中准确表示您自己的真正依赖关系

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


    npm v3(最近发布)通过扁平化依赖关系解决了这个问题。请查看https://github.com/npm/npm/releases/tag/v3.0.0 flat flat部分下的发行说明。

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


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

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

    反馈将是受欢迎的。


    我从Microsoft Node.js指南中找到了一个解决方案。

    • 从短路径开始(例如c: src)
    • > npm install -g rimraf删除超过max_path的文件
    • > npm dedupe将重复的包移动到顶级
    • > npm install -g flatten-packages将所有包移至顶级,但可能导致版本问题
    • 升级到npm@3,尝试使node_modules文件夹heirarchy最大化。

      • 使用Node v5发货
      • 或者...... > npm install –g npm-windows-upgrade

    1)在发布版本期间,您可以通过将文件夹属性设置为隐藏文件夹(JUST将其设置为node_modules)来阻止Visual Studio扫描这些文件/文件夹。
    参考:
    http://issues.umbraco.org/issue/U4-6219#comment=67-19103

    2)您可以通过在CsProject文件中包含以下XML节点来排除在打包期间发布的文件或文件夹。

    1
    2
    3
    4
    5
    6
    7
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
      ...
      <OutputPath>bin\</OutputPath>
       <NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
      <ExcludeFilesFromDeployment>File1.aspx;File2.aspx</ExcludeFilesFromDeployment>
      <ExcludeFoldersFromDeployment>Folder1;Folder2</ExcludeFoldersFromDeployment>
    </PropertyGroup>


    帮助我的一点是将本地驱动器映射到我的Node.js文件夹:

    net use n: computername c $ users myname documents node.js / persistent:yes

    之前:c: users myname documents node.js projectname(45个字符)
    之后:n: projectname(14个字符,少31个字符)

    在许多情况下,这允许安装一些模块。

    我会说当我尝试将所有代码备份到USB驱动器时,我今天才重新发现了这个问题。

    "C:用户 MYNAME 文件的node.js 角phonecat node_modules 因缘 node_modules chokidar node_modules anymatch node_modules micromatch node_modules 正则表达式缓存 node_modules 基准 node_modules 文件阅读器 node_modules extend-shallow benchmark / fixtures太长了。"

    即使我试图使用N:驱动器盘符来支持它们,但在某些情况下由于路径长度仍然失败但是它足以修复上面的那个。


    这不是一个合适的解决方案,而是在您匆忙时解决,但您可以使用7-Zip压缩文件夹,移动压缩文件并解压缩而没有任何问题。

    我们使用该解决方案来部署Node.js应用程序,在该应用程序中无法进行干净的npm安装。