npm 全局路径前缀
Posted
技术标签:
【中文标题】npm 全局路径前缀【英文标题】:npm global path prefix 【发布时间】:2013-01-26 01:44:56 【问题描述】:我比平时更加谨慎,因为我过去一直对 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)
随后
$ jslint ply.js
zsh: command not found: jslint
由于/usr/local/share/npm/bin
不在我的$PATH
中。
1) 为什么brew
没有安装全局npm
bin
path to path?也许确实如此,但zsh
确实把它搞砸了。我在哪里可以找到那个?
2)我应该这样做吗? (将:/usr/local/share/npm/bin
附加到我的~/.zshrc
底部导出的$PATH
)
这似乎不是正确的方法,因为如果我稍后安装其他东西(使用 Homebrew 或其他东西),我需要将它附加到我的 zsh 启动脚本以设置路径。我想在这个特定的例子中,这只是 npm install -g
没有在“正确”位置创建正确的符号链接的问题(比如 /usr/local/bin
也许)。
我认为我要做的是在/usr/local/bin
中为我遇到问题的任何程序手动构建符号链接,它应该足以满足我的目的。
编辑:我将在 2019 年更新这个问题,因为这个老问题很受欢迎,但现在已经过时了,无论是就我的个人工作流程而言,还是就如何最好地安装节点和管理而言它的各种依赖项。
我个人的工作流程现在是使用从 nodejs.org 获得的安装程序在系统上安装 node。实际上,我比自制程序包本身更信任它,因为它最了解如何管理文件。如果您想将系统节点从 8.10 更改为 10.15,无论是在 Mac 还是 Windows 上,只需从 nodejs.org 下载适用于您操作系统的 10.15 的安装程序。根据我的经验,尝试升级通过自制软件安装的节点总是被证明是一种更困难的方法。
另外,需要指出的最重要的一点是,非常不鼓励使用上面我的 npm install of jslint 示例中所示的 sudo;我相当肯定自制软件包永远不应该使用超级用户以任何方式安装或交互。应该没有必要,而且会导致文件权限问题!
此外,我推荐 ESLint 而不是 jslint,并且多年来没有使用过 jslint。
【问题讨论】:
谢谢,它们现在已经修好了。我通常不会那么粗心,但我很快就输入了这个问题 @DaveNewton 我通常会这样做,是的。这个问题真的很草率,但它是我最受欢迎的问题之一。 复制文字不是比截图容易吗?无论如何固定。 @saleemrashid1 嘿,我本来是想这么做的。您真的阅读并复制了吗?谢谢。 是的!不客气。我正在开发一款游戏,在等待 NPM 下载东西的时候我做到了! 【参考方案1】:将您的PATH
扩展为:
export PATH=/usr/local/share/npm/bin:$PATH
这不是一个糟糕的主意。话虽如此,你不应该这样做。
运行这个:
npm config get prefix
OS X 上的默认值为 /usr/local
,这意味着 npm 会将二进制文件符号链接到 /usr/local/bin
,而 /usr/local/bin
应该已经存在于您的 PATH
中(尤其是如果您使用的是 Homebrew)。
所以:
npm config set prefix /usr/local
如果是别的,和
不要将sudo
与 npm 一起使用!根据jslint docs,你应该可以npm install
吧。
如果您将 npm 安装为 sudo (sudo brew install
),请尝试使用普通的 ol'brew install
重新安装它。 Homebrew 应该可以帮助您留住sudo
-free。
【讨论】:
谢谢!不过,npm
拒绝全局安装 jslint
。 npm install -g jslint
失败。 Error: EACCES, open '/Users/user/.npm/564fcf84-jslint.lock'
我不需要chown
/usr/local
如果我要让任何脚本写入链接而不需要sudo
吗?不如关注this 在~/.local
中设置 nom/node 之类的?
甜!我去撤消了用户root
在我的~/
目录中存放的各种目录(sudo rm -r
在tmp/
和.npm/
),随后npm install -g jslint
工作得很好。 npm 本身是一个节点程序,对我来说有点像 JS 命令行概念验证,这很好,现在我对它有了更好的理解。
@StevenLu 是的,chown
-ing /usr/local
以及其中的所有内容都是 OS X 上的标准做法。请参阅 Homebrew wiki 上的 troubleshooting 页面。
是的,我的机器上似乎已经发生了/usr/local
的chown
ing,否则npm
等人在没有sudo
的情况下运行将无法将链接存入/usr/local/bin/
等.【参考方案2】:
在这个问题上花了一段时间,PATH 开关没有帮助。我的问题是在此处找到的 Homebrew/node/npm 错误 - https://github.com/npm/npm/issues/3794
如果您已经使用 Homebrew 安装了节点,请尝试 ****Note per cmets 这可能不安全。它对我有用,但可能会产生意想不到的后果。最新版本的 Homebrew 似乎也正确安装了 npm。我很可能会在尝试之前尝试brew update
、brew doctor
、brew upgrade node
等****:
npm update -gf
或者,如果您想使用 Homebrew 安装节点并让 npm 工作,请使用:
brew install node --without-npm
curl -L https://npmjs.org/install.sh | sh
【讨论】:
随便推荐全球用户强制更新可不是个好主意。 盲目听从网上某人的建议可不是个好主意。 -gf 上的强制方法适合我。谢谢。【参考方案3】:我使用 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
【讨论】:
【参考方案4】:即使在使用 -g 运行 npm 时,brew 也不应该要求您使用 sudo。这实际上可能会在未来产生更多问题。
通常,brew 或 port 可让您更新路径,这样就不会冒弄乱您的 .zshrc、.bashrc、.cshrc 或任何您使用的 shell 的风险。
【讨论】:
确实 brew 不需要并且建议不要使用sudo
。我在npm
上使用sudo(因为我读到的东西告诉我)。我很好奇在哪里查找路径是如何设置的。实际上,zsh
安装程序似乎运行了一些东西,最终将路径(在安装 zsh
时)硬编码到我不太喜欢的 .zshrc
中
npm
安装的任何东西应该安装在/usr/local
中。 /usr
路径命名空间是为您的发行版的官方软件包保留的。 /usr/local/bin
在你的 $PATH 中与否,是一个 zsh 问题。
brew 脚本不会向您的启动脚本添加任何内容,这是您需要做的事情。有关示例,请参见 madebyhoundstooth.com/blog/install-node-with-homebrew-on-os-x。【参考方案5】:
通过执行以下操作,我设法修复了 Vue Cli 无命令错误:
在终端sudo nano ~/.bash_profile
中编辑您的 bash 配置文件。
添加export PATH=$PATH:/Users/[your username]/.npm-packages/bin
保存文件并重启终端
现在您应该可以使用vue create my-project
和vue --version
等。
我是在从https://cli.vuejs.org/ 安装最新的 Vue Cli 之后这样做的
我通常使用 yarn,但我使用 npm npm install -g @vue/cli
全局安装了它。如果你愿意,你也可以使用 yarn yarn global add @vue/cli
注意:如果你已经安装了它,你可能需要先全局卸载它:npm uninstall -g vue-cli
希望这会有所帮助!
【讨论】:
这基本上对我有用。我不得不将其调整为 export PATH=$PATH:/Users/[your username]/node_modules/.bin【参考方案6】:尝试运行:
PATH=$PATH:~/npm/bin
然后在命令行中运行express
进行测试。这对我有用。
【讨论】:
很确定你的意思是~/.npm/bin
或类似的东西。不应将npm
目录添加到您的主目录中。【参考方案7】:
如果您使用 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 的列表,您可以轻松查看链接的节点模块。
【讨论】:
【参考方案8】:sudo brew 不再是一个选项,所以如果你此时使用 brew 安装,你将得到 2 个非常讨厌的东西:
A: 它喜欢安装到/usr/local/opts
或者根据这个,/usr/local/shared。起初这没什么大不了的,但是我遇到了节点 PATH 的问题,尤其是在我安装 lint 时。
B:在您以这种方式卸载并安装它之前,您有点卡在 sudo 命令中,或者您可以从Bitnami 获取堆栈
我推荐这种方法而不是堆栈选项,因为如果您有多个项目,它就可以使用。如果你使用预制的 MEAN 堆栈,你必须在 httpd.conf 中设置虚拟主机(这个堆栈比 XAMPP 更痛苦)加上通常更新你的额外/vhosts.conf 和 /etc/hosts 为每个额外的项目,除非您想在完成更新后重新指向并重新启动服务器。
【讨论】:
【参考方案9】:任何人都遇到了与 brew 和 npm 之间的冲突有关的相同问题 请检查此解决方案https://gist.github.com/DanHerbert/9520689
【讨论】:
【参考方案10】:我从 M1 Apple Silicon 上的自制软件中卸载了节点,而是使用了来自 https://nodejs.org/en/download/ 的 Mac 安装程序。之后,我就可以使用 npm 和 npx 进行安装了。
【讨论】:
【参考方案11】:简单的解决方案是......
只需输入以下命令:
sudo npm config get prefix
如果不是像/usr/local
这样的东西,那么您需要使用以下命令修复它。
sudo npm config set prefix /usr/local
...
现在 100% 正常工作
【讨论】:
强烈建议避免使用 npm 使用 sudo。查看我的编辑。以上是关于npm 全局路径前缀的主要内容,如果未能解决你的问题,请参考以下文章