npm全局路径前缀


142

我比以往更加谨慎,因为我npm对过去的行为感到困惑。

我在Mac上,并通过安装的node.js brew install node

现在,我想jslint.js在命令行中作为命令运行,jslint我发现完成此操作的规范方法是sudo npm install -g jslint成功运行此输出的:

$ sudo npm install -g jslint
npm http GET https://registry.npmjs.org/jslint
npm http 200 https://registry.npmjs.org/jslint
npm http GET https://registry.npmjs.org/jslint/-/jslint-0.1.9.tgz
npm http 200 https://registry.npmjs.org/jslint/-/jslint-0.1.9.tgz
npm http GET https://registry.npmjs.org/nopt
npm http 200 https://registry.npmjs.org/nopt
npm http GET https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz
npm http 200 https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz
npm http GET https://registry.npmjs.org/abbrev
npm http 200 https://registry.npmjs.org/abbrev
npm http GET https://registry.npmjs.org/abbrev/-/abbrev-l.0.4.tgz
npm http 200 https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz
/usr/local/share/npm/bin/jslint -> /usr/local/share/npm/lib/node_modules/jslint/
bin/jslint.js
jslint@0.1.9 /usr/local/share/npm/lib/node_modules/jslint
└── nopt@1.0.10 (abbrev@1.0.4)

后来

$ jslint ply.js
zsh: command not found: jslint

由于/usr/local/share/npm/bin没有在我的身体里$PATH

1)为什么没有brew安装全局npm bin路径到路径?也许是的,但是zsh确实有一些事情弄糟了。我在哪里可以找到?
2)我应该这样做吗?(附加:/usr/local/share/npm/bin$PATH我底部的~/.zshrc

看来这不是正确的方法,因为如果以后再安装其他东西(使用Homebrew或其他方式),则需要将其附加到我的zsh启动脚本中以设置路径。我猜在这种特殊情况下,这只是npm install -g在“适当”位置(例如/usr/local/bin可能)未正确建立符号链接的问题。

我想我会做的是在/usr/local/bin遇到问题的任何程序中手动建立符号链接,对于我的目的来说应该足够好了。

编辑:我将在2019年对此进行更新,因为这个老问题很受欢迎,但就我个人的工作流程以及如何最好地安装节点并管理其各种依赖关系而言,现在已经过时了。

我现在的个人工作流程是使用从nodejs.org获得的安装程序在系统上安装node。实际上,我比自制软件包本身更信任此文件,因为它最了解如何管理文件。如果要将系统节点从8.10更改为10.15,无论是在Mac还是Windows上,只需从nodejs.org下载适用于OS的10.15的安装程序即可。根据我的经验,尝试升级通过自制程序安装的节点一直是比较困难的方法。

另外,需要指出的最大问题是,强烈建议不要使用sudo,如我上面的jslint示例的npm安装中所示。我相当确定,决不能使用超级用户以任何方式来安装或自制软件包。不必要,这会导致文件许可问题!

此外,我推荐使用ESLint而不是jslint,并且多年来没有使用过jslint。


谢谢,他们现在已经固定。我通常不那么粗心,但是我很快就输入了这个问题
Steven Lu

@DaveNewton我通常这样做,是的。这个问题确实很草率,但这是我最受欢迎的问题之一。
史蒂文·卢

复制文本比截屏难吗?无论如何固定的。

1
@ saleemrashid1嘿,我的意思是这样做。您真的阅读并复制了吗?谢谢。
史蒂文·卢

3
是的 别客气。我正在开发游戏,在等待NPM下载东西的时候,我做到了!

Answers:


308

扩展您PATH的:

export PATH=/usr/local/share/npm/bin:$PATH

这不是一个糟糕的主意。话虽如此,您不必这样做。

运行这个:

npm config get prefix

OS X的默认值为/usr/local,这意味着npm会将二进制文件符号链接到/usr/local/bin,该二进制文件应该已经在您的计算机上PATH(尤其是在使用Homebrew的情况下)。

所以:

  1. npm config set prefix /usr/local 如果还有其他事情,并且
  2. 不要sudo与npm一起使用!根据jslint docs,您应该能够npm install做到。

如果您将npm安装为sudo(sudo brew install),请尝试使用plain ol'重新安装它brew install。自制软件应该可以帮助您保持sudo自由。


1
谢谢!npm不过,拒绝在jslint全球安装。npm install -g jslint失败。Error: EACCES, open '/Users/user/.npm/564fcf84-jslint.lock'
史蒂文·卢

2
chown /usr/local如果我不需要任何脚本就可以在其中写入链接,则不需要sudo吗?如何遵循设置nom / node ~/.local或其他呢?
史蒂文·卢

2
甜!我去掉了用户存放root在目录中的各种目录~/(按sudo rm -ron tmp/和a .npm/),随后进行了npm install -g jslint精美的工作。npm本身是一个节点程序,并且对我来说有点像JS命令行概念验证,这很整洁,现在,我对它有所了解后开始欣赏。
史蒂文·卢

2
@StevenLu是的,chown-ing /usr/local及其所有内容都是OS X上的标准做法。请参阅Homebrew Wiki上的疑难解答页面。
Trevor Burnham

是的,它看起来像chown的ING /usr/local已经在我的机器上出现,否则npm等人跑不sudo将无法存到的链接/usr/local/bin/等等
史蒂芬路

8

在这个问题上花了一段时间,并且PATH开关没有帮助。我的问题是在这里找到的Homebrew / node / npm错误-https: //github.com/npm/npm/issues/3794

如果您已经使用Homebrew安装了节点,请尝试****注意每个注释,这可能并不安全。它对我有用,但可能会带来意想不到的后果。似乎最新版本的Homebrew可以正确安装npm。所以,很可能我会尝试brew updatebrew doctorbrew upgrade node等试之前****:

npm update -gf

或者,如果要使用Homebrew安装节点并运行npm,请使用:

brew install node --without-npm
curl -L https://npmjs.org/install.sh | sh

3
随意建议全球各地的人们强制进行更新不是一个好主意。
toxaq 2014年

1
盲目听从互联网上某人的建议不是一个好主意。
Volte 2015年

-gf上的强制方法适合我。谢谢。
MEM

5

我使用brew和前缀已经设置为:

$ npm config get prefix
/Users/[user]/.node

我确实注意到bin和lib文件夹归root所有,这阻止了通常的非sudo安装,因此我将它们重新拥有给用户

$ cd /Users/[user]/.node
$ chown -R [user]:[group] lib
$ chown -R [user]:[group] bin

然后,我将路径添加到位于/ Users / [user]的.bash_profile中

PATH=$PATH:~/.node/bin

3

即使使用-g运行npm,brew也不要求您使用sudo。这实际上可能会在将来产生更多问题。

通常,brew或port可以让您更新路径,因此不会冒乱将.zshrc,.bashrc,.cshrc或任何使用的shell风格弄乱的风险。


的确Brew不要求也不建议使用sudo。我正在使用sudo npm(因为我读过的东西告诉我)。我很好奇在哪里查找路径设置。实际上,似乎zsh安装程序正在运行某些内容,最终将路径(在安装时zsh)硬编码到了.zshrc我不太喜欢的路径
Steven Lu

安装的所有东西npm 都应安装在中/usr/local。该/usr路径命名空间是留给你的发行版的官方软件包。/usr/local/bin是否在$ PATH中是zsh问题。
Floby

brew脚本不会在启动脚本中添加任何内容,这是您需要做的。有关示例,请参见madebyhoundstooth.com/blog/install-node-with-homebrew-on-os-x
Pascal Belloncle

2

通过执行以下操作,我设法修复了Vue Cli no命令错误:

  • 在终端sudo nano ~/.bash_profile中编辑您的bash配置文件。
  • export PATH=$PATH:/Users/[your username]/.npm-packages/bin
  • 保存文件并重启终端
  • 现在,你应该能够使用vue create my-projectvue --version等。

我是从https://cli.vuejs.org/安装了最新的Vue Cli之后执行此操作的

我通常使用yarn,但是我在npm全局安装了它npm install -g @vue/cli。您也可以使用纱线yarn global add @vue/cli

注意:如果已经安装,则可能必须先在全局范围内将其卸载: npm uninstall -g vue-cli

希望这可以帮助!


1
这基本上对我有用。我必须对其进行调整以导出PATH = $ PATH:/ Users / [您的用户名] /node_modules/.bin
Mike Carpenter



0

如果您已使用sudo命令链接了节点程序包

然后转到全局安装了node_modules的文件夹。

在Unix系统上,全局安装时,它们通常位于/ usr / local / lib / node或/ usr / local / lib / node_modules中。如果将NODE_PATH环境变量设置为此路径,则可以按节点找到模块。

Windows XP-%USERPROFILE%\ Application Data \ npm \ node_modules Windows 7-%AppData%\ npm \ node_modules

然后运行命令

ls -l

这将提供所有全局node_modules的列表,您可以轻松查看链接的节点模块。


0

sudo brew不再是一个选项,因此,如果此时与brew一起安装,您将获得2个令人讨厌的东西:A:它喜欢安装在/usr/local/opts/ usr / local / shared中或根据此安装。最初这没什么大不了的,但是我遇到了节点PATH的问题,尤其是在安装lint的时候。B:您有点喜欢sudo命令,直到您以这种方式卸载并安装它,或者可以从Bitnami获取堆栈

我建议在堆栈选项上使用此方法,因为如果您有多个项目,则可以使用该方法。如果使用预制的MEAN堆栈,则必须在httpd.conf中设置虚拟主机(此堆栈中比XAMPP还要痛苦的多),并且通常会为每一个额外的位置更新extra / vhosts.conf和/ etc / hosts项目,除非您要完成升级后再重新指向服务器并重新启动服务器。


0

简单的解决方案是...

只需将以下命令:

  1. sudo npm config get prefix

    如果不是这些/usr/local,则需要使用以下命令对其进行修复。

  2. sudo npm config set prefix /usr/local...

现在100%工作正常


强烈建议使用npm避免sudo。看到我的编辑。
史蒂文·卢
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.