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

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

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

 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是一种select:)

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

并在这个问题上最后的评论https://github.com/npm/npm/issues/3697

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

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

所以,一旦你确定一个重复的模块,使用npm install dupemodule@1.2.3 --save-dev将其安装到根目录node_module目录。 版本很重要。

之后,我删除了我的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下拉你的依赖关系的新副本。

一旦我做到了,一切都变得更加清洁。

我还build议评论你的package.json文件,以显示哪些被放下来扁平化node_modules树。

考虑到你的限制,我不认为有什么好的解决scheme,但是这里有一些可能有用的东西。

  • 尝试使用npm dedupe来优化您的目录层次结构,这可能会缩短一些path
  • 使用npm install --production安装时不需要开发工具
  • 采取一些深层嵌套的依赖关系(只是为了避免这个问题,我build议),并将它们移到顶层node_modules目录。 只要跟踪他们,所以你知道哪些是你的真正的依赖关系,哪些是解决这个问题的方法。
  • 或者将这些深度依赖关系中的一些移动到your_project/node_modules/pkg_with_deep_deps下的最高node_modules目录,这样可以使它们有足够短的path,但仍然可以工作。 所以这将是your_project/node_modules/pkg_with_deep_deps/node_modules
    • 我认为require应该能够在运行时正确地find那些。 你只需要清楚地logging你手动改变了什么,为什么你做了它,并保持自己真正的依赖关系准确地表示在package.json

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

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

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

反馈将是受欢迎的。

帮助我的东西是将本地驱动器映射到我的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个字符less于31个字符)

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

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

“C:\用户\ MYNAME \文件\ Node.js的\angularphonecat \ node_modules \因缘\ node_modules \ chokidar \ node_modules \ anymatch \ node_modules \ micromatch \ node_modules \正则expression式caching\ node_modules \基准\ node_modules \文件阅读器\ node_modules \ extend-shallow \ benchmark \ fixtures太长了。“

即使我试图使用N:驱动器盘符来备份它们,在某些情况下,由于path长度的原因,它仍然失败,但是仅仅修复上面的一个就足够了。

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> 

我从Microsoft Node.js指南中find了一个解决scheme。

  • 从一个简短的path开始(例如c:\ src)
  • > npm install -g rimraf删除超过max_path文件
  • > npm dedupe将重复的软件包移到顶层
  • > npm install -g flatten-packages将所有> npm install -g flatten-packages移动到最高级别,但会导致版本问题
  • 升级到npm@3 ,试图使node_modules文件夹最大化平坦。
    • 随节点v5发货
    • 或者… > npm install –g npm-windows-upgrade

这不是一个适当的解决scheme,而是一个急于求成的解决方法,但是您可以使用7-Zip压缩文件夹,移动压缩文件并解压缩,而不会出现任何问题。

我们使用该解决scheme来部署一个Node.js应用程序,这是不可能做一个干净的NPM安装。