所以我之前遇到过一些npm问题,并遵循一些stackoverflow / github问题命令来尝试修复它们。哪个有用......有点儿。直到最近,当我意识到我的全局npm软件包实际上没有被读取/使用时,一切都很好。
所以,每当我做一个npm -g install xxx或更新。它更新了全局文件夹,但它没有被使用。所以我去挖了一点就找到了。
npm正在阅读/使用
usr/local/lib/node_modules
全局安装到
的位置Users/Me/.npm-global/lib/node_modules
所以每当我对我的模块和东西进行-g检查时,一切都很好并且更新了,但是当我实际尝试运行任何东西时,npm命令使用旧文件夹中的那个。所以基本上我不能使用-g更新或安装任何东西。没有任何东西进入旧文件夹,这是实际使用的文件夹。
我该如何解决这个问题?某些链接或配置文件被搞砸了吗?
答案 0 :(得分:1)
看起来这是关于你的npm前缀配置。 全局前缀是npm将安装全局包的文件夹。
首先,我将运行以下命令来获取全局前缀(https://docs.npmjs.com/cli/prefix)
的值$ npm prefix -g
将其设置为其他值:
npm config set prefix /usr/local/lib/node_modules
这是针对全局包的位置,现在您需要检查终端PATH变量是否正在检查此文件夹中的二进制文件。
$ echo $PATH
上面的命令将打印一个“:”分隔的文件夹位置列表,shell会检查二进制文件。
你的全局npm前缀位置应该是该列表的一部分,从你的问题我假设这个文件夹/ usr / local / lib / node_modules已经是。
答案 1 :(得分:0)
以下是为当前登录用户更改全局npm安装的主目录的步骤:
为全局安装创建目录:
mkdir ~/.npm-global
配置npm以使用新目录路径:
npm config set prefix '~/.npm-global'
打开或创建〜/ .profile文件并添加以下行:
export PATH=~/.npm-global/bin:$PATH
返回命令行,更新系统变量:
source ~/.profile
测试:全局下载包而不使用sudo。
npm install -g <package_name>
代替步骤1-5,您可以使用相应的ENV变量(例如,如果您不想修改〜/ .profile):
NPM_CONFIG_PREFIX=~/.npm-global
如果您使用sudo安装npm模块,则上述配置将无效,因为它将遵循为root用户设置的配置。
答案 2 :(得分:0)
您需要尊重负载的顺序。
Loading from
node_modules
Folders
如果传递给
require()
的模块标识符不是a 核心模块,并没有开始 使用'/'
,'../'
或'./'
,然后Node.js从父目录开始 当前模块,并添加/node_modules
,和 尝试从该位置加载模块。节点不会附加node_modules
到已经结束的路径node_modules
。如果在那里找不到它,那么它 移动到父目录,依此类推,直到文件的根目录 系统已到达。
例如,如果文件位于
'/home/ry/projects/foo.js'
打来电话require('bar.js')
,然后Node.js会查找 以下位置,按此顺序:
/home/ry/projects/node_modules/bar.js
/home/ry/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js
这允许 用于本地化其依赖项的程序,以便它们不会 碰撞。
可能需要特定的文件或子模块 通过在模块之后包含路径后缀来与模块一起分发 名称。例如
require('example-module/path/to/file')
会 解决path/to/file
相对于哪里 找到example-module
。后缀路径跟随 相同的模块解析语义。
答案 3 :(得分:0)
对maxletou的答案进行更改,您是否尝试按如下方式设置前缀?
npm config set prefix /usr/local