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


91

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

例如,这是单个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不是一种选择:)


1
请问您的项目是否有package.jsondependencies集?如果是这样,您是否可以不node_modules使用而使用npm installupdate依赖项进行复制?
乔纳森·洛诺夫斯基

4
@JonathanLonowski我们的部署环境不支持npm install在目标环境中执行,它的工作方式是在本地创建一个“部署包”(基本上是一个ZIP加上一些元数据),然后将其上传到目标计算机,然后在此处提取。所以我需要node_modules直接包括在内。
Borek Bernard

Answers:



62

只是增加了这一点...帮助我的另一件事是使用列出了所有已安装的模块npm ls

这将为您提供一棵模块和版本的树...从那里很容易确定哪些是重复的... npm dedupe对我没有任何帮助。我不确定这是错误还是错误(Node v 10.16)

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

之后,我清除了我的node_modules目录并做了一个new 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树。


这对我来说很棒。谢谢!原谅我的无知,但是为什么模块并不总是安装在顶层?
Caleb 2013年

2
@Caleb可能是因为不同的模块依赖于同一模块的不同版本,或者可能只是因为更容易获得所需的任何东西,然后将其分解...我不知道。
Ben Lesh 2013年

7
无论如何,谢谢你的提示。我刚刚从我们的项目中删除了大约1700个重复文件。删除事物是成为开发人员时我最喜欢的部分!另外,对于任何人寻找到如何添加注释的package.json,这里是你的答案:stackoverflow.com/questions/14221579/...
迦勒

github.com/joyent/node/issues/6960 节点家伙说Windows是一等公民。他们说。但是他们解决了这个问题,没有任何解决方法。幸运的Windows用户。
vee 2014年

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问题的讨论,详细讨论了这个问题。


感谢您指出dedupe(一点都不知道)和--productionnpm install -h没有显示此选项)!遗憾的是,不能使用ZIP存档,请参阅上面的评论。
Borek Bernard

9
npm重复数据删除只会将“通用”模块展平到层次结构中的最低通用位置。还不够好。适当的解决方案将允许“强制统一”整个层次结构,并可能允许忽略test / doc目录。另一种选择是让节点支持直接从tar文件读取模块。
MMind 2012年

3
同意,某种形式的软件包“二进制”分发(ZIP,tarball等)将非常有用。
Borek Bernard '11年

11

我编写了一个名为“ npm-flatten”的节点模块,可在此处为您拉平您的依赖项:https : //www.npmjs.org/package/npm-flatten

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

欢迎反馈。


这为我们工作。当我们首先运行nmp dedup时,我们获得了更好的结果。
肖恩·罗恩

1

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

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

之前: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:驱动器盘符备份它们时,由于路径长度的原因,在某些情况下它仍然会失败,但这足以解决上面的问题。


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>

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

0

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

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


是的 这是我每次需要安装猫鼬时要做的事情。它具有本机代码,并且我具有多个/较新版本的Visual Studio =失败。我可以打开VS,输入每个失败的.sln文件并进行重建。但是,根据需要在我的整个node_modules \ mongoose文件夹集上进行XCOPY比较容易(当然是监视版本)。
迈克尔·布兰肯希
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.