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


177

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

默认情况下,npm local安装最终会位于node_modules当前目录中,但是我希望它安装至node_modules其他目录中vendor/node_modules。我该如何实现?


你想达到什么目的?这已经在这里讨论:stackoverflow.com/questions/13668097/...
帕斯卡尔Belloncle

10
@PascalBelloncle:./node_modules我不想将软件包安装到的子目录中,而是希望npm将它们安装到的子目录中 ./vendor/node_modules。(或者被告知这是不可配置的。)
pje

1
我知道这就是您要执行的操作,我认为这是不可能的。加上require也不起作用。所以我在问你为什么要这样做。也许有另一种解决方案可以满足您的需求。
Pascal Belloncle

1
我正在安装仅用于二进制文件的软件包(即,它将仅在命令行中使用,而从不使用required),但我不想在全球安装它。
pje

我懂了。然后在下面看到我的建议。
Pascal Belloncle

Answers:


180

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

*即使这是“全局”安装,除非~/foo/vendor/node_modules存在中,否则无法通过命令行访问已安装的垃圾箱PATH

TL; R

的每个可配置属性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变量进入config变量(/usr/local默认情况下)。

您可以运行npm config list以查看当前配置并npm config edit进行更改。

聚苯乙烯

一般而言,npm的文档确实很有帮助。该文件夹的部分是新公共管理的一个良好的结构概述和配置部分回答了这个问题。


2
在我测试时,实际上,如果遵循上述命令,它将安装到 ./vendor/node_modules/lib/bower使用npm#3.8.0
e-cloud

2
这样做时,我遇到错误No version provided in package.json
FooBar '16

你写bins won't be accessible through the command line。当然,可以使用完整路径npm install eslint@3.4.0 -g --prefix c:\my_npm` calling c:\ my_npm \ eslint --fix my.js` 调用该程序
BernhardDöbler16年

13
是否可以通过package.json文件实现类似的功能?即,如果我npm install使用package.json文件在目录A中运行,则软件包将安装在目录B中。看来此解决方案适用于要安装的单个软件包。
Ryan-Neal Mes

1
有什么方法可以使用这种方法安装所有依赖项吗?npm install在本地安装依赖项。npm install X -g -prefix "..."将模块X安装到前缀,npm install -g -prefix "..."将当前软件包安装到前缀。
AnnanFay

28

如果要在配置中使用此功能,则可以这样设置npm config:

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

要么

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

使用以下命令检查您的配置

npm config ls -l

或如@pje所说并使用--prefix标志


4
我相信这会设置全局前缀吗?因此,这样做npm install仍将在本地安装,./node_modulesnpm install -g将安装到"$(pwd)/vendor/node_modules"。我可以想象设置此设置,然后忘记它,后来又想知道为什么我的全局软件包运行异常。
AnnanFay

13

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

在.npmrc中:

prefix=${HOME}/npm

然后从命令行运行此命令:

npm config ls -l

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

为了安全起见,我建议使用这种方法来通过设置/usr/local文件夹来配置用户帐户的npm行为,我在其他地方已经看到过这种建议。


9

例如,在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


1
谢谢,我按照步骤进行。但是它将创建一个名为c:/%NPM_HOME%/ npm等的目录,而不是c:/ npm_home / npm
Jay

6

我自己搜索完此项目后,希望将几个具有共享依赖项的项目设为DRYer,我发现:

  • 想要通过任何方式使用的任何东西,本地安装都是Node的方式 require()
  • 全局安装是针对您想要的路径中的二进制文件,但不适用于通过 require()
  • 使用前缀意味着您需要添加适当的binman路径$PATH
  • npm linkinfo)允许您使用本地安装作为全局变量的源

→坚持使用Node方式并在本地安装

参考:

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.