NPM全局路径前缀

164

因为过去我曾被npm的行为所困惑,所以现在比平常更加谨慎。

我使用Mac,并通过brew install node安装了node.js。

现在我想要在命令行上运行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)
Subsequently.
$ jslint ply.js
zsh: command not found: jslint

由于/usr/local/share/npm/bin不在我的$PATH中,所以出现问题。

1)为什么brew没有将全局npm bin路径安装到路径中?也许它已经这样做了,但是zsh的某些设置搞砸了。我该去哪里找到它呢?
2)我应该这么做吗?(在~/.zshrc底部附加:/usr/local/share/npm/bin导出到$PATH中)

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

我认为我将手动在任何我遇到问题的程序中构建出符号链接,并且这对我的目的已经足够好了。

编辑:我在2019年更新了这篇文章,因为这个老问题虽然很受欢迎,但已经过时了,无论是从我的个人工作流程还是从如何最好地安装node和管理其各种依赖关系方面。

我的个人工作流程现在是使用从nodejs.org获取的安装程序在系统上安装节点。实际上,我比起homebrew包本身更信任它,因为它最懂得如何管理这些文件。如果你想将你的系统节点从8.10升级到10.15(无论是在Mac还是Windows上),只需为您的操作系统下载来自nodejs.org的10.15安装程序即可。在我的经验中,试图升级通过Homebrew安装的节点一直是一种更困难的方法。

另外,最需要指出的一点是,像我上面所示的npm安装jslint的sudo用法是不被推荐的;我相当确定homebrew软件包不应该使用superuser进行安装或与之交互。这不是必要的,并且会导致文件权限头痛!

此外,我建议使用ESLint而不是jslint,并且多年来没有使用jslint。


谢谢,现在它们已经修复了。我通常不会那么粗心,但是这个问题我打得很快。 - Steven Lu
@DaveNewton 我通常是这样做的,是的。这个问题确实很草率,但它是我最受欢迎的问题之一。 - Steven Lu
复制文本不是更容易吗?无论如何已经修复了。 - user1974640
1
@saleemrashid1 嘿,我一直想做这件事。你真的读过它并复制了吗?谢谢。 - Steven Lu
3
没问题!欢迎你。我正在开发一款游戏,而我在等待 NPM 下载东西时就做了它!(注:NPM 是一种用于管理 JavaScript 代码包的工具。) - user1974640
显示剩余2条评论
12个回答

339

将您的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文档,只需执行npm install即可。

如果您使用sudo安装了npm (sudo brew install),请尝试使用普通的brew install重新安装它。 Homebrew旨在帮助您避免使用sudo


1
谢谢!npm 拒绝全局安装 jslint。 但是,npm install -g jslint 失败了。Error: EACCES, open '/Users/user/.npm/564fcf84-jslint.lock' - Steven Lu
2
如果我想让任何脚本在不需要 sudo 的情况下将链接写入 /usr/local,那么我不需要对其进行 chown 吗?或者,按照 此处 的建议,在 ~/.local 或其他位置设置 nom/node 是否可行? - Steven Lu
2
太好了!我刚刚删除了用户“root”在我的~/目录中放置的各种文件夹(通过在tmp/.npm/上使用sudo rm -r),随后运行npm install -g jslint非常成功。很整洁,npm本身就是一个Node程序,并且对于我来说它是JS命令行概念验证,现在我更好地理解它。 - Steven Lu
2
@StevenLu 是的,在 OS X 上 chown /usr/local 及其所有内容是标准做法。请参阅 Homebrew 维基上的 故障排除 页面。 - Trevor Burnham
@tadman,感谢您的提示!但对我来说,它们最终都会在同一个位置~/.zshrc - Steven Lu
显示剩余9条评论

7

我在这个问题上花了一些时间,但PATH开关没有起作用。我的问题是Homebrew/node/npm的一个错误,可以在https://github.com/npm/npm/issues/3794找到。

如果你已经使用Homebrew安装了node,请尝试****注意评论中可能不安全。它对我有用,但可能会产生意想不到的后果。最新版本的Homebrew似乎也正确地安装了npm。因此,在尝试之前,我会尝试brew updatebrew doctorbrew upgrade node等操作****:

npm update -gf

或者,如果你想使用Homebrew安装Node并且让npm正常工作,请使用以下命令:

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

4
随意建议全球人强制更新并不是一个好主意。 - toxaq
2
盲目地听从网络上某人的建议并不是一个好主意。 - Volte
-gf 上的强制方法对我很有帮助。谢谢。 - MEM

6
我使用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

然后我只需将路径添加到我的.bash_profile中,该文件位于/Users/[用户]。

PATH=$PATH:~/.node/bin

5
我通过以下步骤修复了Vue Cli无法识别命令的问题:
  • 在终端中输入sudo nano ~/.bash_profile 来编辑bash配置文件。
  • 添加export PATH=$PATH:/Users/[你的用户名]/.npm-packages/bin
  • 保存文件并重启终端
  • 现在,你应该能够使用vue create my-projectvue --version等命令了。
这是我在从https://cli.vuejs.org/安装最新的Vue Cli之后完成的。
我通常使用yarn,但我用npm全局安装了它:npm install -g @vue/cli。如果你想的话也可以使用yarn:yarn global add @vue/cli 注意: 如果你已经全局安装了Vue Cli,则可能需要先卸载它:npm uninstall -g vue-cli 希望这能帮到你!

2
这对我基本上起作用了。我不得不调整它以导出PATH=$PATH:/Users/[你的用户名]/node_modules/.bin - Mike Carpenter
即使我使用了 export PATH=$PATH:~/.npm-global/bin,我的终端正确地找到了全局包,但我必须在每次打开终端时手动输入它。我该如何解决这个问题? - pokercatt

3

即使使用npm -g运行,brew也不应要求您使用sudo。这可能会在以后造成更多问题。

通常,brew或port允许您更新路径,以便不会破坏您使用的.shellrc、.bashrc、.cshrc或其他类型的shell。


确实,brew 不需要也不建议使用 sudo。我曾在 npm 上使用 sudo(因为我读到了某些东西告诉我要这样做)。我很好奇应该去哪里查找路径是如何设置的。实际上,zsh 安装程序运行了一些东西,最终将路径硬编码(在安装 zsh 时)到 .zshrc 中,这让我感到有些不满意。 - Steven Lu
任何由 npm 安装的东西应该安装在 /usr/local 中。/usr 路径命名空间是为您的发行版的官方软件包保留的。 /usr/local/bin 是否在您的 $PATH 中,这是一个 zsh 问题。 - Floby
Brew脚本不会添加任何内容到你的启动脚本,这是你需要自己完成的。请参考http://madebyhoundstooth.com/blog/install-node-with-homebrew-on-os-x/获取示例。 - Pascal Belloncle

2
在新的MacOS版本中,您需要编辑.zshrc文件而不是.bash_profile
在终端中输入nano ~/.zshrc 然后添加以下行:
export PATH=$PATH:/Users/[your username]/.npm-packages/bin

0

尝试运行:

PATH=$PATH:~/npm/bin

然后在命令行中运行express进行测试。这对我有用。


很确定你的意思是 ~/.npm/bin 或类似的路径。不应该在你的主目录下添加一个 npm 目录。 - Steven Lu

0

sudo brew已不再是一个选项,因此如果您在这个时候使用brew安装,您将会遇到两个非常烦人的问题: A: 它喜欢安装到/usr/local/opts或者根据这个路径,/usr/local/shared。起初这并不是什么大问题,但我在安装lint时遇到了node PATH的问题。 B: 你只能使用sudo命令,直到你卸载并以这种方式重新安装它,或者你可以从Bitnami获取堆栈。

我推荐这种方法而不是堆栈选项,因为如果您有多个项目,它已经准备好了。如果您选择预制的MEAN堆栈,您将需要在httpd.conf中设置虚拟主机(在这个堆栈中比XAMPP更麻烦),还要更新extra/vhosts.conf和/etc/hosts以适应每个额外的项目,除非您想在更新完毕后重新指向并重启服务器。


0

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

那么进入全局安装的node_modules所在的文件夹。

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

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

然后运行命令

ls -l

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


0

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