全局 Node 模块未正确安装。命令未找到。

110
我遇到了一个安装全局 node 模块的问题,网上所有的解决方法都说只需添加 -g 参数即可,但这并不是问题所在。我认为这可能是链接问题或目录错误引起的。
以下是我的操作步骤:
$ npm install -g express
npm http GET https://registry.npmjs.org/express
npm http 304 https://registry.npmjs.org/express
npm http GET https://registry.npmjs.org/range-parser/0.0.4
npm http GET https://registry.npmjs.org/mkdirp/0.3.3
...downloads correctly

$ express myapp
bash: express: command not found

然而,当我运行直接链接位置到express时,它可以正常工作:
   $ /usr/local/share/npm/bin/express myapp

   create : myapp
   create : myapp/package.json
   create : myapp/app.js
... Builds app correctly

模块所在位置:

$ which node
/usr/local/bin/node
$ node -pe process.execPath
/usr/local/Cellar/node/0.8.20/bin/node
$ npm link express
/Users/bentonrr/Development/Personal/node_modules/express -> /usr/local/share/npm/lib/node_modules/express

在我的 .bash_profile 文件中,我有:
export PATH=/usr/local/bin:$PATH
export NODE_PATH=/usr/local/lib/node_modules:/usr/local/lib/node

我需要更改我的Node环境才能下载到正确的文件夹吗?是否有某些链接出了问题?我很迷茫...

谢谢!

其他规格:

$ node --version
v0.8.20
$ npm --version
1.2.11
$ brew --version
0.9.4
OSX Version 10.8.2

1
这是因为 /usr/local/share/npm/bin/ 不在你的 shell 的 $PATH 中,所以 shell 找不到 express - JP Richardson
2
我在我的.bash_profile文件中添加了export PATH=/usr/local/share/npm/bin:$PATH,然后它就起作用了。谢谢!请回答以便我接受并点赞。 - im_benton
在我的情况下,我也通过Cellar在OSX上安装了NPM,我在.bash_profile中设置的bin路径是:export PATH=$PATH:/usr/local/Cellar/node/10.5.0/bin - Shanerk
10个回答

163
这可能意味着您的节点安装前缀与您预期的不同。
您可以这样设置它:
npm config set prefix /usr/local
然后再次尝试运行npm install -g,应该可以解决问题。在我的Mac上有效,解决方案来自这个网站:

http://webbb.be/blog/command-not-found-node-npm/

编辑:请注意,我在设置新的Mac时再次遇到这个问题,并且还需要按照在stackoverflow上详细介绍的步骤进行操作。
编辑2:如@MEMOGAMER000在评论中提到的

对于Windows用户,您可以运行npm config set prefix C:\Users\username\而不是/usr/local/. –


4
我已经花了数月时间想要解决这个问题,而这是唯一一个能够帮我解决的答案!非常非常感谢你。 - azz0r
1
我尝试了很多解决方案,但只有这个对我有效。 由于某种原因,即使我进行了全新的安装,我的前缀仍设置为“/Users/(username)/.npm-global”。我也在使用Mac。 - Castilho
干得好!像魔法一样顺利! - Sajal Shrestha
1
谢谢!在我的MacOS Ventura上,npm config set prefix /usr/local 对我有用。 - And Finally
1
对于Windows用户,您可以运行npm config set prefix C:\Users\用户名\而不是/usr/local/。 - MEMOGAMER000
显示剩余3条评论

100

$(npm get prefix)/bin添加到您的PATH中(例如在.bashrc文件中),如下所示:

echo "export PATH=$PATH:$(npm get prefix)/bin" >> ~/.bashrc

更多信息请参阅npm help npm

全局模式: npm将包安装到prefix/lib/node_modules的安装前缀中,并将bin安装在prefix/bin中。

您可以使用npm get prefixnpm config list | grep prefix找到安装前缀。


对于不使用sudo的nvm,路径不应该是$HOME/.npm吗?要添加到.bash_profile或.bashrc中吗?我使用nvm,所以想确保不会在这方面出现交叉问题。 - blamb
1
对于那些通过Homebrew在OSX上安装了Node和npm的人来说,需要添加到“PATH”的bin文件夹的位置将是“/usr/local/Cellar/node/VERSION_NUMBER/bin/”。 - Jon Betts
在我的情况下,我稍微扩展了Tim的答案,以便实际路径在bash配置文件中是动态的: echo "export PATH=\$PATH:\$(npm get prefix)/bin" >> ~/.bash_profile 我使用了 .bash_profile,但在大多数情况下,你也可以使用 .bashrc - Michael Behrens
附加提示:使用 source ~/.bashrc 可以快速更新 PATH 而无需重新启动。 - Neeraj
即使我使用了 export PATH=$PATH:~/.npm-global/bin,我的终端正确地找到了全局包,但每次打开新的终端都需要手动输入。我该如何解决这个问题? - pokercatt

16

我的npm也无法找到全局包。我做了Brad Parks建议的操作:

npm config set prefix /usr/local

然后我遇到了一个EACCES权限错误(不要使用sudo npm install -g <package>),并通过官方npm文档进行了修复:https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally

  1. 在命令行中,在你的主目录下创建一个用于全局安装的目录:
 mkdir ~/.npm-global
  1. 配置npm使用新的目录路径:
 npm config set prefix '~/.npm-global'
  1. 在您喜欢的文本编辑器中,打开或创建一个 ~/.profile 文件,并添加此行:
 export PATH=~/.npm-global/bin:$PATH
在命令行中,更新您的系统变量:
 source ~/.profile
  1. 然后全局安装一个包并测试它!例如:
npm install -g awsmobile-cli
awsmobile configure


1
大家好,我有一个问题。在第二步之后,我在 ~/.npm-global 中找不到 **bin/**。所以,它不能工作,对吗? - AquariusPotter
它应该仍然可以工作。不要忘记export PATH =〜/ .npm-global / bin:$ PATH行在〜/ .profile文件中。您有任何错误吗? - Vicente

11

在我的情况下,NODE_PATH环境变量是空的。请检查它是否为空 -

echo $NODE_PATH
如果 NODE_PATH 是空的。那么更改 ~/.bash_profile 并添加 NODE_PATH
nano ~/.bash_profile
export NODE_PATH=`npm root -g`
source ~/.bash_profile

现在再次安装npm模块,并检查是否已将其安装在路径中 npm root -g


这是我在使用NVM和repl的时候遇到的问题,需要它在Linux/Fedora上查找全局包。 - Ray Foss
我在使用NVM时遇到了同样的问题。 - H_I

7

针对 Windows 用户

将以下内容添加到您的路径中: "%AppData%\npm"


我希望这个答案的权重更高。 - Shawn

4

我从不通过sudo安装任何npm软件包!我有自己的原因,但只是试图保持简单和基于用户,因为这是一个用户开发的世界,并非每个人都有root访问权限,使用root / sudo安装此类软件似乎只会使事情更加混乱。毕竟,所有开发人员都应该能够遵循这些说明,而不仅仅是特权sudo用户。

这个系统是通过SSH访问的RHEL7:

经常需要不同版本的node,所以我使用NVM https://github.com/creationix/nvm

因此,说了这么多,我可以向您展示一个使用NVM、NPM和节点路径的工作示例,而不使用root进行全局安装。

如果还没有设置您的前缀为“.npm-packages”,请设置它。(注意,这是连字符,而不是下划线)

nvm config ls
prefix = "/home/<yourusername>/.npm-packages"

如果你愿意,可以调整你的 ~/.bash_profile 或 .bashrc 文件(点击这里了解为什么以及哪一个文件更适合自己),并加入以下信息。

#PATH EXPORTS
NODE_MODULES=$HOME/.npm                                          
NPM_PACKAGES=$HOME/.npm-packages/bin                           
export PATH=$PATH:$HOME/bin:$NODE_MODULES:$NPM_PACKAGES         

#NVM ENABLE                                                 
export NVM_DIR="$HOME/.nvm"                                   
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm 

这基本上涵盖了所有路径。例如,如果您像这样安装gulp npm install -g gulp,它会在~/.npm-packages/bin中创建符号链接(注意是连字符而不是下划线)。无需gulp-cligulp-cl
您可以替换/注释掉所有其他节点路径导出。您可以将此路径信息安全地放置在您已经拥有的任何其他路径信息下面,而不会覆盖那些内容。

2
检查您的全局Node模块的二进制文件夹,并将其添加到$PATH中。
npm list -g | head -1

如果您使用 nodenv,每当您安装新的全局节点版本时,路径都会发生更改。像这样添加一个节点路径可以解决我的问题。
"$HOME/.nodenv/versions/$(nodenv global)/bin"

添加到zsh路径的快捷方式

$ echo 'export PATH="$HOME/.nodenv/versions/$(nodenv global)/bin"' >> ~/.zshrc

1
  1. Add the following line to your ~/.bash_profile

    export PATH="$HOME/.npm/bin:$PATH"
    
  2. Load bash profile

    bash -l
    

0
我遇到的问题是缺少二进制文件,因为我家目录下用户特定的.npmrc文件中的bin-links设置为false,尽管默认值为true
如果这也是你的问题,请检查您的任何.npmrc文件是否将其设置为false。
然后重新安装所有模块将在前缀处创建二进制文件,以便您的PATH可以看到它们。

0

看起来可能像是一个黑科技,但如果有可能,设置yarn可以为各种Unix发行版节省许多节点环境的烦恼。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接