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

219

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

默认情况下,npm本地安装将以当前目录中的node_modules结束,但我希望它安装到不同目录中的node_modules,例如vendor/node_modules。如何实现这一点?


你想要达成什么目的?这个问题已经在这里讨论过了:https://dev59.com/l2Yr5IYBdhLWcg3wcJ10 - Pascal Belloncle
12
与其将包安装到./node_modules的子目录中,我希望npm可以将它们安装到./vendor/node_modules的子目录中(或告诉我这是不可配置的)。 - pje
1
我理解你想做的事情,但我认为这是不可能直接实现的。而且 require 也行不通。所以我想问一下你为什么要这样做。也许有其他替代方案可以实现你的需求。 - Pascal Belloncle
1
我正在安装一个仅用于其二进制文件的包(即它只会在命令行上使用,而且永远不会被“require”),但我不想全局安装它。 - pje
我明白了。那么请看下面我的建议。 - Pascal Belloncle
5个回答

206

简述

您可以通过使用--prefix标记和--global*标记来实现此目的。

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

即使这是一个“全局”安装,除非~/foo/vendor/node_modulesPATH中存在,否则安装的二进制文件将无法通过命令行访问。

简而言之

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来更改配置。
附注:
通常来说,npm的文档非常有帮助。folders部分提供了npm的结构概述,而config部分则回答了这个问题。

2
根据我的测试,实际上如果按照上述命令执行,它将会被安装在 ./vendor/node_modules/lib/bower 目录下,使用的是 npm#3.8.0 - e-cloud
3
在执行此操作时,我遇到了错误 package.json 中未提供版本号 - FooBar
你写道 bins 不会通过命令行访问。当然,可以使用完整路径 npm install eslint@3.4.0 -g --prefix c:\my_npm\ 调用程序,调用 c:\my_npm\eslint --fix my.js - Bernhard Döbler
22
通过一个 package.json 文件是否可以实现类似的功能?例如,如果我在有 package.json 文件的 A 目录中运行 npm install,那么包将会安装在 B 目录中。这个解决方案似乎是针对单个包的安装的。 - Ryan-Neal Mes
1
有没有办法使用这种方法安装所有依赖项?npm install 会在本地安装依赖项。npm install X -g -prefix "..." 将模块 X 安装到前缀,npm install -g -prefix "..." 将当前包安装到前缀。 - AnnanFay
1
那么,我从这个答案中的理解是,我不能阻止npm在我的用户%userprofile%、%appdata%、环境变量等地方乱扔东西?我该如何告诉npm不允许它把玩具带到客厅、厨房和走廊以及整个地方,或者换句话说,它只能把玩具放在自己的房间D:\Projects\里? - AaA

38
如果您想在配置中进行此操作,可以像这样设置npm配置:
npm config set prefix "$(pwd)/vendor/node_modules"

或者

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

使用以下命令检查配置:

npm config ls -l

或者像 @pje 说的那样,使用 --prefix 标志。


9
我相信这设置了全局前缀?因此执行 npm install 仍会在本地安装到 ./node_modules,但 npm install -g 会安装到 "$(pwd)/vendor/node_modules"。我可以想象将其设置后就忘记它,过一会儿回来时会想知道为什么我的全局包表现得很奇怪。 - AnnanFay

16
在OSX上,你可以前往用户的$HOME目录(可能是/Users/yourname/),如果不存在,请创建一个.npmrc文件(npm用于用户配置的文件),并创建一个npm软件包安装目录(例如/Users/yourname/npm)。在那个.npmrc文件中,将"prefix"设置为你的新npm目录,这将是“全局”安装npm软件包的位置;这些“全局”软件包显然仅对你的用户帐户可用。
在.npmrc文件中: prefix=${HOME}/npm 然后在命令行中运行此命令: npm config ls -l 它应该给出你自己的本地配置和全局npm配置的输出,并且你应该在输出的长列表顶部附近看到你的本地prefix配置反映出来。
出于安全原因,我建议采用这种方式配置你的用户帐户的npm行为,而不是更改/usr/local文件夹的所有权,这是我在其他地方看到的推荐方法。

10

例如,在 Windows 7 上,可以使用以下一组命令/操作:

创建个人环境变量,双反斜杠是必需的:

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

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

  • 设置npm文件夹

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

  • 设置npm缓存文件夹

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

  • 设置npm临时文件夹

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

可选择在更改配置之前清除原始文件夹的内容。

  • 删除npm缓存npm cache clear

  • 列出npm模块npm -g ls

  • 删除npm模块npm -g rm name_of_package1 name_of_package2


2
谢谢,我按照步骤操作了。但是它创建的目录名为c:/%NPM_HOME%/npm等,而不是c:/npm_home/npm。 - Jay

8

在寻找多个项目共享依赖项以使代码更加精简的过程中,我找到了以下信息:

  • 本地安装是使用 require() 导入任何内容的 Node.js 的方法
  • 全局安装适用于你想要在系统路径下使用的二进制文件,但不适用于需要通过 require() 导入的内容
  • 使用前缀意味着你需要将相应的 binman 路径添加到 $PATH
  • npm link (info) 允许你使用本地安装作为全局安装的源

→ 坚持 Node.js 的方式并进行本地安装

参考文献:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接