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

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

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

【问题讨论】:

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

标签: node.js npm


【解决方案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方式,本地安装

    参考:

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 2022-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多