如何在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
。
简洁版本
-
npm ls
获取所有已安装模块的列表。 - 查看这些模块并确定重复的模块( 版本很重要 )
-
npm install module@version --save-dev
将这些模块安装在根node_modules目录中并更新package.json。 -
rmdir node_modules
删除node_modules目录。 -
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安装。