Fish shell和全局npm模块

7
我在本地环境遇到了一些问题。
我使用的工具包括:
- homebrew(版本号1.1.4) - fish shell(版本号2.4) - n 版本管理器(版本号2.1.0) - node - npm
以上所有工具都是最初通过homebrew安装的。
具体问题如下:
- 无法运行任何全局安装的模块。 - 我无法更新npm版本。
我经常使用的node版本为0.10.48和6.9.2,但大多数是4.6.2。
我已经在fish中创建了一些别名以便能够运行全局模块。然而,我更希望解决根本原因,而不是继续采用其他方法来修复问题。
额外信息:
~> npm config get prefix
/Users/me/.npm-packages

~> npm bin
/Users/me/node_modules/.bin

当我尝试更新npm时会发生什么:

~> npm install -g npm@3
/Users/me/.npm-packages/bin/npm -> /Users/me/.npm-packages/lib/node_modules/npm/bin/npm-cli.js
npm@3.10.10 /Users/me/.npm-packages/lib/node_modules/npm
~> npm -v
2.15.9

当我尝试调用全局模块时:
~> gulp
fish: Unknown command 'gulp'

我为了解决全局模块问题所尝试的方法:

~> cat ~/.config/fish/config.fish
set fish_user_paths /Users/me/.npm-packages

ls ~/.config/fish/functions
bower.fish ember.fish pm2.fish

~> cat ~/.config/fish/functions/bower.fish 
function bower
    /Users/me/.npm-packages/bin/bower  $argv;
end

非常感谢您提供的任何帮助!我已经尝试了一段时间,但仍然没有解决问题!


1
这似乎是一个简单的问题,即 /Users/me/.npm-packages/bin/ 不在 PATH 中。请问 echo $PATH 是否包含 /Users/me/.npm-packages/bin/ - ridiculous_fish
1
echo $PATH 显示的内容有冒号吗?(不应该有,而应该是以空格为分隔符)如果没有冒号,则 gulp 必定在其他地方。在 gulp 可用的环境中运行 which gulp 命令会显示什么? - ridiculous_fish
谢谢您的回复。echo $PATH ~> /Users/me/.npm-packages /usr/local/bin /usr/bin /bin /usr/sbin /sbin我尝试了 which gulp (和其他模块),但都没有返回值。我在 fish shell 和 bash 中都尝试了。 - kurt343
1
我有一个非常相似的设置,并发现自己不得不为每个新的shell运行nvm use default,请参见https://github.com/fisherman/nvm/issues/11 - fanaugen
对于任何阅读此内容的人,我不再认为我的问题与fish shell有特定关联,因为我已经测试了bash和zsh,并且遇到了相同的问题。 - kurt343
显示剩余3条评论
5个回答

5

你可以使用已安装的npm模块。只需要将npm全局路径添加到shell中即可。为了做到这一点,我运行了如下命令:

$ npm config get prefix
// Output: /usr/local/Cellar/node/9.2.1

然后,添加到我的fish/config.fish文件中:

set PATH /usr/local/Cellar/node/9.2.1/bin $PATH

这是我解决问题时有帮助的Github相关链接.


2

对我来说,这些都没有起作用,所以我安装了 oh my fish nvm 插件

omf install nvm

1
当您全局安装Node应用程序时会发生什么 https://docs.npmjs.com/getting-started/fixing-npm-permissions 在OSX 10.12.5上配置 fish v2.6.0 node v8.1.0 在终端中输入示例命令将返回两者。
term~> npm install jshint -g
/Users/username/npm-global/lib/node_modules/bin/jshint -> 
/Users/username/npm-global/lib/node_modules/jshint/bin/jshint

在shell中启用执行已安装的包jshint,需要添加以下路径到PATH:指向实际安装位置

在文件~/.profile中配置PATH,请包含下面这行。

export PATH="$HOME/npm-global/lib/node-modules/:$PATH"

1

我永久性的解决方案(使用macOS Mojave和fish 2.7.1):

set -U fish_user_paths /Users/{USERNAME}/.npm-packages/bin $fish_user_paths

顺便提一下,下面的代码只在终端会话中起作用:

set PATH $PATH /Users/{USERNAME}/.npm-packages/bin

注意:您可以使用以下命令查找npm包的路径:

printf "%s\n" $PATH

或者 fish_add_path /Users/{USERNAME}/.npm-packages/bin - Alexandre Daubricourt

-8

我通过完全卸载(并删除任何痕迹)nodenpmn,卸载fish shell并改用zsh来解决这个问题。

之后,我安装了nvm并使用它来恢复我的机器上的node

全局npm模块现在可以正常工作。


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