如何为本地安装 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 也不起作用。所以我问你为什么要这样做。也许有另一种解决方案可以做你想做的事。
我只为它的二进制文件安装一个包(即它只会在命令行上使用,而不是require
d),但我不想全局安装它。
我明白了。那么请参阅下面的建议。
【参考方案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/.npmrc
或 userconfig
参数
全局配置文件:$PREFIX/etc/npmrc
或 userconfig
参数
内置配置文件: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 config set cache "%NPM_HOME%\\npm-cache"
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()
进行的任何操作
使用前缀意味着您需要将适当的bin
和man
路径添加到$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 包设置自定义位置?的主要内容,如果未能解决你的问题,请参考以下文章