91

我遇到了一个奇怪的问题 - 显然某些 Node.js 模块的文件夹层次结构如此之,以至于当路径超过 250 时,Windows 复制命令(或Copy-Item我们实际使用的 PowerShell)会遇到臭名昭著的“路径太长”错误字符长。

例如,这是单个 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\...

这看起来很疯狂,但却是 Node 模块的现实。

我们需要在部署期间使用复制粘贴(我们没有使用像 Heroku 这样的“聪明”目标平台,可以选择 Git 部署),这对 Windows 来说是一个严重的限制。

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

4

8 回答 8

62

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

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

因此,一旦您识别出重复的模块,请使用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 树。

于 2013-08-27T18:32:03.277 回答
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问题讨论,详细阐述了这个问题。

于 2012-11-10T02:39:13.957 回答
24

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

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

于 2015-07-07T11:14:43.797 回答
11

我写了一个名为“npm-flatten”的节点模块,在这里为你扁平化你的依赖:https ://www.npmjs.org/package/npm-flatten

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

欢迎反馈。

于 2014-05-04T19:28:00.400 回答
1

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

净使用 n:\computername\c$\users\myname\documents\node.js /persistent:yes

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

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

我会说我今天在尝试将所有代码备份到 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 太长。”

即使我尝试使用 N: 驱动器号备份它们,由于路径长度,它在某些情况下仍然失败,但它足以修复上述问题。

于 2015-05-05T02:12:45.280 回答
1

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

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

<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>
于 2015-10-12T19:38:52.427 回答
1

我从Microsoft Node.js Guidelines中找到了一种解决方案。

  • 从短路径开始(例如 c:\src)
  • > npm install -g rimraf删除超过max_path
  • > npm dedupe将重复的包移动到顶层
  • > npm install -g flatten-packages将所有包移动到顶层,但可能导致版本控制问题
  • 升级到npm@3哪个尝试使node_modules文件夹层次结构最大程度地平坦。
    • 随 Node v5 提供
    • 或者…> npm install –g npm-windows-upgrade
于 2015-11-16T12:10:25.813 回答
0

这不是一个合适的解决方案,而是当您赶时间时的一种解决方法,但是您可以使用7-Zip压缩您的文件夹,移动压缩文件并解压缩它而不会出现任何问题。

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

于 2014-10-08T15:51:15.563 回答