如何为本地安装 npm 包设置自定义位置?

Posted

技术标签:

【中文标题】如何为本地安装 npm 包设置自定义位置?【英文标题】:How to set custom location for local installation of npm package? 【发布时间】:2013-01-22 10:43:48 【问题描述】:

是否可以通过命令标志或环境变量为npm install 指定自定义包目的地?

默认情况下,npm 本地安装最终在当前目录中的 node_modules 中,但我希望它安装在不同目录中的 node_modules 中,例如 vendor/node_modules。我怎样才能做到这一点?

【问题讨论】:

你想完成什么?这已经在这里讨论过:***.com/questions/13668097/… @PascalBelloncle:我希望 npm 将它们安装到 ./vendor/node_modules 的子目录中,而不是安装包到 ./node_modules 的子目录中。 (或者被告知这是不可配置的。) 我知道这就是您想要做的,我认为开箱即用是不可能的。加上 require 也不起作用。所以我问你为什么要这样做。也许有另一种解决方案可以做你想做的事。 我只为它的二进制文件安装一个包(即它只会在命令行上使用,而不是required),但我不想全局安装它。 我明白了。那么请参阅下面的建议。 【参考方案1】:

TL;DR

您可以使用--prefix 标志和--global* 标志来做到这一点。

pje@friendbear:~/foo $ npm install bower -g --prefix ./vendor/node_modules
bower@0.7.0 /Users/pje/foo/vendor/node_modules/bower

*即使这是“全局”安装,也无法通过命令行访问已安装的 bin,除非 ~/foo/vendor/node_modules 存在于 PATH 中。

TL;DR

npm 的每个可配置属性都可以设置在六个不同位置中的任何一个。按优先顺序排列:

命令行标志:--prefix ./vendor/node_modules 环境变量:NPM_CONFIG_PREFIX=./vendor/node_modules 用户配置文件:$HOME/.npmrcuserconfig 参数 全局配置文件:$PREFIX/etc/npmrcuserconfig 参数 内置配置文件:path/to/npm/itself/npmrc 默认配置:node_modules/npmconf/config-defs.js

默认情况下,本地安装的包进入./node_modules。全局变量进入prefix 配置变量(默认为/usr/local)。

您可以运行npm config list 来查看您当前的配置,并运行npm config edit 来更改它。

PS

总的来说,npm 的文档确实很有帮助。 folders 部分是一个很好的 npm 结构概述,config 部分回答了这个问题。

【讨论】:

我测试了一下,实际上如果按照上面的命令,它会被安装到./vendor/node_modules/lib/bower使用npm#3.8.0 执行此操作时,我收到错误 No version provided in package.json 是否可以使用 package.json 文件实现类似的功能?即,如果我使用 package.json 文件在目录 A 中运行 npm install,包将安装在目录 B 中。看来此解决方案适用于正在安装的单个包。 有没有办法使用这种方法安装所有依赖项? npm install 在本地安装依赖项。 npm install X -g -prefix "..." 将模块 X 安装到前缀,npm install -g -prefix "..." 将当前包安装到前缀。 所以我从这个答案的理解是,我无法停止 npm 乱扔我的用户 %userprofile% 、%appdata%、环境变量等?我如何告诉 npm 不允许将他的玩具带到客厅、厨房和走廊,而且通常到处都是,或者换句话说,它只能将他的玩具放在他自己的房间里,位于 `D:\Projects`?跨度> 【参考方案2】:

如果你想在 config 中设置这个,你可以像这样设置 npm config:

npm config set prefix "$(pwd)/vendor/node_modules"

npm config set prefix "$HOME/vendor/node_modules"

检查你的配置

npm config ls -l

或者正如@pje 所说,使用--prefix 标志

【讨论】:

我相信这设置了全局前缀?所以npm install 仍然会在本地安装到./node_modules,但npm install -g 将安装到"$(pwd)/vendor/node_modules"。我可以想象设置这个然后忘记它,后来回来想知道为什么我的全局包表现得很奇怪。【参考方案3】:

对于 OSX,您可以转到用户的 $HOME(可能是 /Users/yourname/),如果它不存在,则创建一个 .npmrc 文件(npm 用于用户配置的文件),并为要安装的 npm 包创建一个目录(例如,/Users/yourname/npm)。在那个 .npmrc 文件中,将“前缀”设置为新的 npm 目录,这将是安装“全局”安装的 npm 包的位置;显然,这些“全球”软件包仅对您的用户帐户可用。

在 .npmrc 中:

prefix=$HOME/npm

然后从命令行运行这个命令:

npm config ls -l

它应该在你自己的本地配置和全局 npm 配置中给出输出,并且你应该看到你的本地前缀配置反映,可能在输出长列表的顶部附近。

为了安全起见,我建议使用这种方法来配置您的用户帐户的 npm 行为,而不是 chown-ing 您的 /usr/local 文件夹,我在其他地方看到过这种方法推荐。

【讨论】:

【参考方案4】:

例如,在 Windows 7 上,可以使用以下命令/操作集。

创建个人环境变量,双反斜杠是强制性的:

变量名:%NPM_HOME% 变量值:C:\\SomeFolder\\SubFolder\\

现在,将配置值设置为新文件夹(示例文件名):

设置npm文件夹

npm config set prefix "%NPM_HOME%\\npm"

设置 npm-cache 文件夹

npm config set cache "%NPM_HOME%\\npm-cache"

设置npm临时文件夹

npm config set tmp "%NPM_HOME%\\temp"

或者,您可以在配置更改之前清除原始文件夹的内容。

删除 npm-cache npm cache clear

列出npm模块npm -g ls

删除 npm 模块 npm -g rm name_of_package1 name_of_package2

【讨论】:

谢谢,我按照步骤操作。但它会创建一个名为 c:/%NPM_HOME%/npm 等的目录,而不是 c:/npm_home/npm【参考方案5】:

在搜索了这个我想要几个具有共享依赖项的项目成为 DRYer 之后,我发现:

本地安装是你想通过require()使用的任何东西的节点方式 全局安装适用于路径中所需的二进制文件,但不适用于通过require() 进行的任何操作 使用前缀意味着您需要将适当的binman 路径添加到$PATH npm link (info) 允许您使用本地安装作为全局变量的来源

→ 坚持Node方式,本地安装

参考:

Perfect summary from isaacs npm 常见问题解答:"node_modules" is the name of my deity's arch-rival, and a Forbidden Word in my religion. Can I configure npm to use a different folder? ;-)

【讨论】:

以上是关于如何为本地安装 npm 包设置自定义位置?的主要内容,如果未能解决你的问题,请参考以下文章

本地项目的npm安装方法

EF 5 + SQL Server CE 4:如何为数据库文件指定自定义位置?

npm 安装本地包

分清全局安装与本地安装

npm(cnpm)全局安装和本地安装的区别

在本地构建和使用npm包