安装节点包时可以使用自定义目录名称而不是“node_modules”吗?

Posted

技术标签:

【中文标题】安装节点包时可以使用自定义目录名称而不是“node_modules”吗?【英文标题】:Can a custom directory name be used instead of 'node_modules' when installing node packages? 【发布时间】:2014-03-16 03:16:23 【问题描述】:

我创建了一个package.json,我运行npm install,它工作正常。它在我的根文件夹中创建了一个node_modules 目录(我可以使用--prefix 选项进行更改)。但是,我不太喜欢下划线。我想更改 NPM 将模块下载到的目录的名称。我希望将其命名为 nmodsnode-modules 或类似名称。

Bower 可以通过读取当前目录中.bowerrc 文件中的directory 属性来做类似的事情。有没有办法对 NPM 做同样的事情?

【问题讨论】:

绝对!此外,由于node_modules 依赖项被一遍又一遍地递归,这个相当长的名称有时也会打破 Windows 中的文件路径限制。像nmods 这样的短名称会大大降低这种风险......哦,天哪。 然而,正如@thomasjaworski.com 所争论的那样,它可能是一个 Windows 错误,而不是一个节点/npm 错误。这在 github 问题(找不到 atm)上被大量讨论,所以我不会争论;)。只是说:P 同意 @codeninja 我知道你的意思是哪个 github 线程,我觉得这两个都不是一个好的借口 :) Windows 因路径长度限制而完全失败,而 nodejs 的家伙并没有因为选择这个悲惨而做得更好约定 我描述了基于符号链接 (Mac/Linux) 的部分解决方法:Huge number of files generated for every Angular project 【参考方案1】:

没有办法改变它。 node_modules 文件夹实际上并不特定于 NPM,它是 Node 核心模块加载系统的一部分。 Seen here in module.js.

如您所提到的那样全局更改它也可能会破坏您正在使用的一些模块,因为模块有时是它们的依赖关系已经存在于node_modules 中的包,并且更改它会导致它中断。

【讨论】:

npm 的常见问题解答也非常明确地解决了这个问题:npmjs.org/doc/… 并解释了其中的一些原因。 该死的下划线! :( @ZiaUrRehman,这只是一个约定。社区中的每个人都在使用它,所以你只需要习惯它。 旧常见问题解答的缓存链接:web.archive.org/web/20150216184318/https://docs.npmjs.com/misc/… npm 常见问题解答链接已损坏。【参考方案2】:

在 npm 中无法更改它,但是,在yarn package manager 中可以选择配置它。

yarn install --modules-folder <path>

【讨论】:

创建 .yarnrc 文件省去了每次都必须输入 --modules-folder 的麻烦。请参阅下面的答案。 但是在执行Yarn run时它不起作用,它说找不到包webpack。【参考方案3】:

你可以通过添加一个名为 '.yarnrc' 的文件轻松实现这一点 内容如下:

# ./.yarnrc
--modules-folder lib

下次你运行 'yarn' 时,它将创建 lib 文件夹并将软件包安装到那里而不是 node_modules 中。

现在,如果我们能让 'npm install' 变得同样聪明就好了。

【讨论】:

你会把这个放在用户目录还是项目目录? 它应该放在与创建 node_modules 文件夹相同的文件夹中。这应该与您从中运行纱线命令的文件夹相同。这通常是项目目录。例外情况是,如果您通常从项目的子文件夹中运行 yarn,那么您应该将 .yarnrc 文件夹放在那里。 这在require 的世界里会怎样?

以上是关于安装节点包时可以使用自定义目录名称而不是“node_modules”吗?的主要内容,如果未能解决你的问题,请参考以下文章

Woocommerce REST API:自定义字段而不是产品名称

我可以使用 IP 地址作为名称服务器而不是创建自定义名称服务器 [关闭]

分布式安装 Elasticsearch

安装我的 NPM 包时将文件移动到根目录

TypeError:vue.openBlock 不是函数,同时使用自定义节点模块中的 vue 组件

如何使用 MongoDB 中的自定义字段对分页进行索引和排序,例如:名称而不是 id