[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

VM开发取得进展! 将node_modules移动到任何你喜欢的地方并使用它们!

你好。
我是Mandai,负责Wild 开发团队。

即使你不使用 Node.js 开发系统,我认为也存在使用 Node.js 来减少工作量的常见模式。
例如,我使用 webpack 预编译 CSS 和转译 JS 文件,对于日常任务,我使用 gulp 创建脚本并定期运行它们。有各种各样的用例,我觉得它正在逐渐成为我日常生活的一部分。那。

Node.js 有一个名为 npm 的包管理工具,但是这次我们总结了当由于某种原因需要将 node_modules 目录移到项目目录之外时该怎么做。

 

什么叫有一定的理由呢? !

原因是开发环境的问题。

我认为VM经常被用作开发环境,但这次我将使用Windows 10作为主机操作系统,在Virtualbox上运行CentOS 7(并使用vagrant管理它)。
在这样一个共同的开发环境中出现了意想不到的陷阱。

看似突然,但我特别的一点是,我在开发时一直使用 Visual Studio Code(以下简称 VSCode),而今年我就想着坚持下去,而且今年已经是 8 月份了,我已经习惯了很多。
VSCode 使用 Node.js(TypeScript)开发,并使用 Electron 成为可以在多个平台上使用的编辑器。

这是!

VSCode 快捷键在 Linux 上很难使用,因此无法选择在虚拟机上安装 VSCode 并使用它进行开发。这只不过是压力(我确信 Windows 版本非常容易使用,因为它是由 Microsoft 开发的)。

因此,开发环境的配置也需要围绕VSCode进行更改。

综上所述,通过使用VirtualBox的共享文件夹功能共享整个项目目录,将Windows VSCode编辑的内容共享给VM,仅此而已。
如果以无头模式启动 VM,则可以减少意外负载,因此最多可以运行 3 个 VM。

 

陷阱 #1 “node_modules 目录无法共享”

假设您了解情况,那么大问题仍然存在。
这就是问题所在:“node_modules 目录无法共享。”

文件可以共享,但如果仔细考虑一下,node_modules 是在 npm install 时根据平台创建的,因此包含与平台相关的二进制文件的模块可能会出现问题。

如果将node_modules放在项目目录之外,这个问题似乎可以解决。
相反,您需要为每个开发平台执行 npm install,但我认为 npm install 就是这样,所以我并不担心它。

 

陷阱#2“超出最大调用堆栈大小”

在共享文件夹内执行 npm install 时,我经常遇到错误“超出最大调用堆栈大小”。
我不太明白,但似乎这个错误的原因是共享文件夹。 参考资料 - npm 错误!代码 ETXTBSY · 问题 #9979 · npm/npm · GitHub

所以,这个问题似乎可以通过将node_modules放在项目目录之外来解决。

 

在任何你喜欢的地方安装node_modules

实际上,您可以使用 npm config 命令更改node_modules 的位置。
可以使用以下命令更改它。

npm 配置设置前缀“/home/vagrant”

 

npm 识别的 node_modules 目录现在是“/home/vagrant/node_modules”。

但是,这仅意味着 npm 现在将 node_modules 的位置识别为“/home/vagrant/node_modules”,因此即使您在此状态下运行 npm install,node_modules 仍将位于与 package.json 相同的级别。是执着的...

因此,在安装命令中也要指定前缀,并使用以下命令进行安装。

npm install --prefix “/home/vagrant”

 

这可能会导致错误。
这种错误。

npm WARN saveError ENOENT:没有这样的文件或目录,打开'/home/vagrant/package.json'

 

没有package.json! 有!
我想了一下,--prefix指定的目录下需要package.json!

硬复制很难管理,因此我们将使用符号链接。

cd /home/vagrant ln -s /home/vagrant/src/package.json ln -s /home/vagrant/src/package-lock.json # 有时

 

这是有package-lock.json的问题,但是在第一次安装的情况下,原始文件将存在于“/home/vagrant”中,因此一旦安装完成,您必须将其复制到工作目录发生。
这也适用于 VSCode。我无能为力。

之后,使用前缀运行 npm install 继续安装。

顺便说一句,我认为 npm install 非常慢,但是当我在共享文件夹之外运行它时,它最终变得一团糟。
共享文件夹很方便,但速度很慢。

 

有时,这不仅仅是在任何地方。

尽管我说它可以安装在任何地方,但这并不意味着它可以安装在任何地方。
以下是当node_modules安装在某个目录中并且执行任务运行器gulp时发生的情况。

gulp sass [06:46:05] 在 ~/src 中找不到本地 gulp [06:46:05] 尝试运行: npm install gulp

 

我确信 gulp 是在全局和本地安装的,所以我认为奇怪的原因是 node_modules 与 package.json 不在同一层。
经过一番谷歌搜索后,我似乎无法弄清楚,所以我查看了 gulp 源并找到了答案。 → gulp-cli/index.js at master · gulpjs/gulp-cli · GitHub

由于 cfgLoadOrder 数组中包含的唯一字符串是 home 和 cwd,因此最好将 node_modules 直接放在主目录下。
这就是为什么示例中粘贴的命令的前缀是主目录。

当我在主目录下创建node_modules时,即使node_modules不在通常的位置,我也能够成功执行gulp任务。

我觉得写一个配置文件会给我更多的自由,但我不太明白这一点,所以如果有时间我会研究一下。

 

概括

我各种方式都跑题了,文字也变得有点乱,所以我就在这里总结一下。

  • 有时,npm 安装目录无法在虚拟机的共享文件夹中共享。
    • 如果您使用需要依赖于平台的二进制文件的模块,则为 NG
    • 由于共享文件夹的性质,您甚至无法在共享文件夹上运行 npm install。
    • 如果主机和来宾都是*nix系统,也许可以?
  • 可以使用 npm install 命令的选项“--prefix”更改创建 node_modules 的位置。
  • package.json必须提前放在“--prefix”指定的目录下(符号链接也可以)
  • 有时候,比如gulp,node_modules的位置不是空闲的。
  • Node.js 很方便

最后我觉得还是直接放在home目录下比较好。
我为每个项目使用不同的虚拟机,尽管我可以使用配置文件来管理它,但我认为只为我自己使用 gitignore 会很奇怪。

能够将 node_modules 从工作目录中分离出来真是太棒了。

 
就是这样。

如果您觉得这篇文章有帮助,请点赞!
0
加载中...
0 票,平均:0.00 / 10
38,136
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[大阪/横滨] 积极招募基础设施工程师和服务器端工程师!

[大阪/横滨] 积极招募基础设施工程师和服务器端工程师!

写这篇文章的人

关于作者

万代洋一

我的主要工作是为社交游戏开发 Web API,但我也很幸运能够做很多其他工作,包括营销。
此外,我在 Beyond 中的肖像权被视为 CC0。