How to deploy Node.js application with deep node_modules structure on Windows?
我遇到了一个奇怪的问题 - 显然一些Node.js模块有如此深的文件夹层次结构,Windows复制命令(或PowerShell的
例如,这是单个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目录并执行了新的
精简版
一旦我这样做,一切都更清洁。
我还建议您对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
关于这个问题的最后评论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安装。