205

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

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

4

5 回答 5

197

TL;博士

您可以通过使用--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;博士

的每个可配置属性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的文档真的很有帮助。文件夹部分是 npm 的一个很好的结构概述,配置部分回答了这个问题。

于 2013-02-14T02:53:00.307 回答
36

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

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

或者

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

检查您的配置

npm config ls -l

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

于 2015-01-29T02:04:00.970 回答
16

对于 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文件夹,我在其他地方看到过推荐这种方法。

于 2014-04-25T08:05:48.700 回答
10

例如,在 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 缓存 npm cache clear

  • 列出 npm 模块 npm -g ls

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

于 2017-02-07T13:50:20.700 回答
8

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

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

→ 坚持Node方式,本地安装

参考:

于 2013-11-14T10:31:13.403 回答