Fedora 33 - npm存在兩個版本的問題

Fedora 無法通過dnf module install nodejs:14安裝新版本的nodejs。

嘗試通過npm更新ndoejs,首先更新npm

>sudo cnpm install npm@latest -g
...
All packages installed (used 31ms(network 29ms), speed 0B/s, json 0(0B), tarball 0B)
[[email protected]] link /usr/bin/npm@ -> /usr/lib/node_modules/npm/bin/npm-cli.js
[[email protected]] link /usr/bin/npx@ -> /usr/lib/node_modules/npm/bin/npx-cli.js
> npm -v
6.14.8
> which npm
/usr/local/bin/npm
> /usr/bin/npm -v
7.11.1
> which cnpm
/usr/local/bin/cnpm
> cnpm -v
[email protected] (/usr/local/lib/node_modules/cnpm/lib/parse_argv.js)
[email protected] (/usr/local/lib/node_modules/cnpm/node_modules/npm/lib/npm.js)
[email protected] (/usr/bin/node)
[email protected] (/usr/local/lib/node_modules/cnpm/node_modules/npminstall/lib/index.js)
prefix=/usr 
linux x64 5.11.15-200.fc33.x86_64 
registry=https://r.npm.taobao.org

發現有兩個版本的npm同時存在,路徑不同。

/usr/bin/npm 是新版本

/usr/local/bin/npm 是舊版本

爲什麼存在兩個版本?難道是因爲我用了zsh?

檢查~/.zshrc,發現有一行內容

# If you come from bash you might have to change your $PATH.
export PATH=$HOME/bin:/usr/local/bin:$PATH

原本第二行是註釋的,我是從bash(fedora默認用bash)轉爲zsh,所以把註釋去掉。

檢查環境變量

> echo $PATH
/home/ydx/bin:/usr/local/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/home/ydx/bin:/home/ydx/Dev/flutter/bin

可以看到/usr/local/bin的位置在/usr/bin之前。所以zsh先找到舊版本的npm。但是爲什麼npm更新時它自己不會更新所有軟連接?

檢查npm命令的真實位置

> ls -la /usr/local/bin | grep npm
lrwxrwxrwx.  1 root root       33 Jan 25  2020 cnpm -> ../lib/node_modules/cnpm/bin/cnpm
lrwxrwxrwx.  1 root root       38 Sep 18  2020 npm -> ../lib/node_modules/npm/bin/npm-cli.js
lrwxrwxrwx.  1 root root       38 Sep 18  2020 npx -> ../lib/node_modules/npm/bin/npx-cli.js
> ls -la /usr/bin | grep npm
lrwxrwxrwx   1 root root           38 Apr  6 23:06 npm -> ../lib/node_modules/npm/bin/npm-cli.js
lrwxrwxrwx   1 root root           38 Apr  6 23:06 npx -> ../lib/node_modules/npm/bin/npx-cli.js
> /usr/local/bin/npm -v
6.14.8
> /usr/bin/npm -v
7.11.1

媽呀,兩個npm指向的是同一個地方啊!!仔細一看,其實不是同一個地方。因爲目的地用的是../相對路徑。

那麼我只需要刪除舊版本的node_modules,系統就能找到新的有效的npm命令。剩下壞掉的無效的軟鏈接,後面再看怎麼刪除。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章