寫這篇文章之前,關於ubuntu14.04(Trusty)預設安裝的NodeJS版本是0.10.25百思不解(什麼鬼,哪一年的NodeJS) 寫這篇文章之時,NodeJS的LTS版本號都已經10.15.0,當然Ubuntu在2018年也都發行ubuntu18.04(我還沒打算用) 系統我可以用4... ...
引言:
寫這篇文章之前,關於ubuntu14.04(Trusty)預設安裝的NodeJS版本是0.10.25百思不解(什麼鬼,哪一年的NodeJS)
寫這篇文章之時,NodeJS的LTS版本號都已經10.15.0,當然Ubuntu在2018年也都發行ubuntu18.04(我還沒打算用)
系統我可以用4年前的,但是node不行
於是每次都要倒騰Node新版本的安裝,踩過一些坑
但是本著刨根問底的原則,還是收穫不小
PS:
https://nodejs.org/zh-cn/download/releases/
沒錯,14年4月份(ubuntu14.04)發行時,NodeJS剛剛發行了還不是LTS版本的0.10.25(2014-01-23)
姿勢A:源碼編譯安裝
【推薦指數:★★★☆☆】
官網下載源碼:http://nodejs.cn/download/ 或者你會用wget ***
cd your-source-code-directory ./configure make sudo make install
姿勢優點:./configure 可以自定義安裝目錄,咳咳,沒必要哈
姿勢缺點:make 費時耗力,記憶體不大夠的VPS或者虛擬機同學建議繞開此姿勢
捫心自問:Linux系統下用戶自己安裝的軟體(如Node、MongoDB),一般都分佈在哪些目錄?
絕大數開源軟體都是公佈源代碼的,源代碼一般被打包為tar.gz歸檔壓縮文件,然後由使用者自行編譯為二進位可執行文件
相容性好/可控制性好/開源軟體會大量使用其他開源軟體的功能,要解決大量的依賴關係
./configure 檢查編譯環境/相關庫文件/配置參數,生成makefile
make 對源代碼進行編譯,生成可執行文件
make install 將生成的可執行文件安裝到當前電腦中
姿勢B:添加PPA 用Ubuntu的方式安裝
【推薦指數:★★★★★】
ganiks@ganiks-ubuntu-trusty-64:~$ logout Connection to 127.0.0.1 closed. PS D:\ganiks\ganiks_ubuntu_trusty64> vagrant destroy default: Are you sure you want to destroy the 'default' VM? [y/N] y ==> default: Forcing shutdown of VM... ==> default: Destroying VM and associated drives... PS D:\ganiks\ganiks_ubuntu_trusty64> vagrant up #OK, 又是一個乾凈的環境了 #記得更換/etc/apt/source.list為本地源(如阿裡雲) ganiks@ganiks-ubuntu-trusty-64:~$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - ## Installing the NodeSource Node.js 8.x LTS Carbon repo... #添加PPA這個過程好漫長……5-10分鐘我這裡
#終於添加成功,開始用咱ubuntu的方式安裝 ganiks@ganiks-ubuntu-trusty-64:~$ sudo apt-get install -y nodejs Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: nodejs 0 upgraded, 1 newly installed, 0 to remove and 12 not upgraded. Need to get 13.6 MB of archives. After this operation, 64.3 MB of additional disk space will be used. Get:1 https://deb.nodesource.com/node_8.x/ trusty/main nodejs amd64 8.15.0-1nodesource1 [13.6 MB] Fetched 13.6 MB in 8min 13s (27.5 kB/s) Selecting previously unselected package nodejs. (Reading database ... 63153 files and directories currently installed.) Preparing to unpack .../nodejs_8.15.0-1nodesource1_amd64.deb ... Unpacking nodejs (8.15.0-1nodesource1) ... Processing triggers for man-db (2.6.7.1-1ubuntu1) ... Setting up nodejs (8.15.0-1nodesource1) ... #快來看看成果,不錯,這個方式很ubuntu ganiks@ganiks-ubuntu-trusty-64:~$ whereis node node: /usr/bin/node /usr/bin/X11/node /usr/include/node /usr/share/man/man1/node.1.gz ganiks@ganiks-ubuntu-trusty-64:~$ whereis npm npm: /usr/bin/npm /usr/bin/X11/npm ganiks@ganiks-ubuntu-trusty-64:~$ node -v v8.15.0 ganiks@ganiks-ubuntu-trusty-64:~$ npm -v 6.4.1
參考文檔:
https://github.com/nodesource/distributions#debinstall
NodeSource will maintain Ubuntu distributions in active support by Canonical, including LTS and the intermediate releases.
- Ubuntu 14.04 LTS (Trusty Tahr) - not available for Node.js 10 and later
- Ubuntu 16.04 LTS (Xenial Xerus)
- Ubuntu 18.04 LTS (Bionic Beaver)
- Ubuntu 18.10 (Cosmic Cuttlefish)
姿勢C:用NPM模塊【n】更新Node和NPM
【推薦指數:★★★★★】
#一個乾凈的ubuntu14.04環境 #預設的方式安裝nodejs以及npm ganiks@ganiks-ubuntu-trusty-64:~$ sudo apt install nodejs-legacy npm ganiks@ganiks-ubuntu-trusty-64:~$ npm -v 1.3.10 ganiks@ganiks-ubuntu-trusty-64:~$ node -v v0.10.25 #設置npm源為淘寶源 ganiks@ganiks-ubuntu-trusty-64:~$ sudo npm config set registry https://registry.npm.taobao.org #安裝npm包:n ganiks@ganiks-ubuntu-trusty-64:~$ sudo npm i -g n npm http GET https://registry.npm.taobao.org/n npm http 200 https://registry.npm.taobao.org/n npm http GET https://registry.npm.taobao.org/n/download/n-2.1.12.tgz npm http 200 https://registry.npm.taobao.org/n/download/n-2.1.12.tgz /usr/local/bin/n -> /usr/local/lib/node_modules/n/bin/n [email protected] /usr/local/lib/node_modules/n #用包n安裝穩定版本的nodejs ganiks@ganiks-ubuntu-trusty-64:~$ sudo n stable install : node-v11.6.0 mkdir : /usr/local/n/versions/node/11.6.0 fetch : https://nodejs.org/dist/v11.6.0/node-v11.6.0-linux-x64.tar.gz ######################################################################## 100.0% installed : v11.6.0 #安裝成功後查看node版本,發現sudo可以訪問到新安裝的版本,憑直覺用戶貌似需要重新登錄一下 ganiks@ganiks-ubuntu-trusty-64:~$ node -v v0.10.25 ganiks@ganiks-ubuntu-trusty-64:~$ npm -v 1.3.10 ganiks@ganiks-ubuntu-trusty-64:~$ sudo node -v v11.6.0 ganiks@ganiks-ubuntu-trusty-64:~$ sudo npm -v 6.5.0-next.0 #查看node所在,發現模塊n安裝的node在/usr/local路徑下,而老版本的node還在/usr路徑下 ganiks@ganiks-ubuntu-trusty-64:~$ whereis node node: /usr/bin/node /usr/bin/X11/node /usr/local/bin/node /usr/share/man/man1/node.1.gz ganiks@ganiks-ubuntu-trusty-64:~$ /usr/bin/node -v v0.10.25 ganiks@ganiks-ubuntu-trusty-64:~$ /usr/local/bin/node -v v11.6.0 #希望直覺是對的,logout ganiks@ganiks-ubuntu-trusty-64:~$ logout Connection to 127.0.0.1 closed. $ D:\ganiks\ganiks_ubuntu_trusty64> vagrant ssh Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 3.13.0-164-generic x86_64) Last login: Fri Jan 18 07:24:38 2019 from 10.0.2.2 #重新登錄,是新版啦 ganiks@ganiks-ubuntu-trusty-64:~$ node -v v11.6.0 ganiks@ganiks-ubuntu-trusty-64:~$ npm -v 6.5.0-next.0 #嗯,但是 /usr/bin/node 老版本還在,只是 $PATH後面的路徑 /usr/local/bin/node 覆蓋了老版本 ganiks@ganiks-ubuntu-trusty-64:~$ /usr/bin/node -v v0.10.25 #強迫症的我還是卸載掉老版本吧,嘻嘻 ganiks@ganiks-ubuntu-trusty-64:~$ sudo apt remove node-legacy npm
模塊n的用法:https://www.npmjs.com/package/n
儘可能深刻地解決每一個問題~
https://www.cnblogs.com/ganiks
繼續,我還用過後面2個方案~
在nodejs中文網 有個阿裡雲鏡像的東東, 預設是最新版本的地址:
https://npm.taobao.org/mirrors/node/v10.15.0/
(如果需要其他版本的所有鏡像,去掉url後面的版本號訪問即可)
../ docs/ 26-Dec-2018 05:30 - win-x64/ 26-Dec-2018 06:43 - win-x86/ 26-Dec-2018 06:01 - node-v10.15.0-aix-ppc64.tar.gz 26-Dec-2018 06:17 22797819(21.74MB) node-v10.15.0-darwin-x64.tar.gz 26-Dec-2018 05:24 16354900(15.6MB) node-v10.15.0-darwin-x64.tar.xz 26-Dec-2018 05:25 11071128(10.56MB) node-v10.15.0-headers.tar.gz 26-Dec-2018 05:31 446984(436.51kB) node-v10.15.0-headers.tar.xz 26-Dec-2018 05:31 336760(328.87kB) node-v10.15.0-linux-arm64.tar.gz 26-Dec-2018 04:57 18598724(17.74MB) node-v10.15.0-linux-arm64.tar.xz 26-Dec-2018 04:59 11776444(11.23MB) node-v10.15.0-linux-armv6l.tar.gz 26-Dec-2018 04:50 17537202(16.72MB) node-v10.15.0-linux-armv6l.tar.xz 26-Dec-2018 04:51 10762604(10.26MB) node-v10.15.0-linux-armv7l.tar.gz 26-Dec-2018 04:53 17389653(16.58MB) node-v10.15.0-linux-armv7l.tar.xz 26-Dec-2018 04:54 10696212(10.2MB) node-v10.15.0-linux-ppc64le.tar.gz 26-Dec-2018 04:51 18620944(17.76MB) node-v10.15.0-linux-ppc64le.tar.xz 26-Dec-2018 04:52 11524352(10.99MB) node-v10.15.0-linux-s390x.tar.gz 26-Dec-2018 04:54 18879786(18.01MB) node-v10.15.0-linux-s390x.tar.xz 26-Dec-2018 04:54 11475136(10.94MB) node-v10.15.0-linux-x64.tar.gz 26-Dec-2018 06:27 18630524(17.77MB) node-v10.15.0-linux-x64.tar.xz 26-Dec-2018 06:28 12307872(11.74MB) node-v10.15.0-sunos-x64.tar.gz 26-Dec-2018 04:52 19959848(19.04MB) node-v10.15.0-sunos-x64.tar.xz 26-Dec-2018 04:53 12839268(12.24MB) node-v10.15.0-win-x64.7z 26-Dec-2018 06:49 9666719(9.22MB) node-v10.15.0-win-x64.zip 26-Dec-2018 06:53 16252020(15.5MB) node-v10.15.0-win-x86.7z 26-Dec-2018 06:01 8593771(8.2MB) node-v10.15.0-win-x86.zip 26-Dec-2018 06:01 14743242(14.06MB) node-v10.15.0-x64.msi 26-Dec-2018 06:56 17297408(16.5MB) node-v10.15.0-x86.msi 26-Dec-2018 06:01 15708160(14.98MB) node-v10.15.0.pkg 26-Dec-2018 05:40 16615683(15.85MB) node-v10.15.0.tar.gz 26-Dec-2018 05:26 36300933(34.62MB) node-v10.15.0.tar.xz 26-Dec-2018 05:29 20217588(19.28MB) SHASUMS256.txt 26-Dec-2018 16:25 3347(3.27kB) SHASUMS256.txt.asc 26-Dec-2018 16:25 3884(3.79kB) SHASUMS256.txt.sig 26-Dec-2018 16:25 310(310B)
下載 “node-v10.15.0-linux-x64.tar.gz” 來研究下
ganiks@ganiks-ubuntu-trusty-64:~$ wget https://npm.taobao.org/mirrors/node/v10.15.0/node-v10.15.0-linux-x64.tar.gz 2019-01-18 10:09:05 (5.77 MB/s) - ‘node-v10.15.0-linux-x64.tar.gz’ saved [18630524/18630524] ganiks@ganiks-ubuntu-trusty-64:~$ ls node-v10.15.0-linux-x64.tar.gz ganiks@ganiks-ubuntu-trusty-64:~$ tar xzf node-v10.15.0-linux-x64.tar.gz ganiks@ganiks-ubuntu-trusty-64:~$ ls node-v10.15.0-linux-x64 node-v10.15.0-linux-x64.tar.gz ganiks@ganiks-ubuntu-trusty-64:~$ ls -l node-v10.15.0-linux-x64 total 164 drwxrwxr-x 2 ganiks ganiks 4096 Dec 26 06:27 bin -rw-rw-r-- 1 ganiks ganiks 52896 Dec 26 06:27 CHANGELOG.md drwxrwxr-x 3 ganiks ganiks 4096 Dec 26 06:27 include drwxrwxr-x 3 ganiks ganiks 4096 Dec 26 06:27 lib -rw-rw-r-- 1 ganiks ganiks 65839 Dec 26 06:27 LICENSE -rw-rw-r-- 1 ganiks ganiks 25981 Dec 26 06:27 README.md drwxrwxr-x 5 ganiks ganiks 4096 Dec 26 06:27 share ganiks@ganiks-ubuntu-trusty-64:~$ ls -l node-v10.15.0-linux-x64/bin node-v10.15.0-linux-x64/lib/node_modules/ node-v10.15.0-linux-x64/bin: total 38284 -rwxrwxr-x 1 ganiks ganiks 39199960 Dec 26 06:26 node lrwxrwxrwx 1 ganiks ganiks 38 Dec 26 06:27 npm -> ../lib/node_modules/npm/bin/npm-cli.js lrwxrwxrwx 1 ganiks ganiks 38 Dec 26 06:27 npx -> ../lib/node_modules/npm/bin/npx-cli.js node-v10.15.0-linux-x64/lib/node_modules/: total 4 drwxrwxr-x 10 ganiks ganiks 4096 Dec 26 06:27 npm
其實裡面是在 linux-x64 環境下已經編譯過的nodejs,怎麼用呢?
姿勢D:直接下載編譯過的包 分別部署到 /usr/local/bin 以及 /usr/local/lib/node_modules
【推薦指數:★★★☆☆】
看下這個包的結構,bin、include、lib、share貌似很眼熟啊,跟linux系統中的 /usr 目錄下的結構基本一致
ganiks@ganiks-ubuntu-trusty-64:~$ ls -l /usr/ total 48 drwxr-xr-x 2 root root 20480 Jan 18 09:48 bin drwxr-xr-x 2 root root 4096 Apr 10 2014 games drwxr-xr-x 33 root root 4096 Jan 18 09:48 include drwxr-xr-x 69 root root 4096 Jan 18 09:48 lib drwxr-xr-x 10 root root 4096 Jan 10 20:43 local drwxr-xr-x 2 root root 4096 Jan 10 21:43 sbin drwxr-xr-x 123 root root 4096 Jan 18 09:48 share drwxr-xr-x 5 root root 4096 Jan 10 21:42 src
OK,那我的想法:把 node包下的 bin include lib share四個目錄分別跟 /usr下對應同名的目錄合併
但是註意一點,/usr這種系統目錄,以及目錄下的子目錄都是 root:root 的許可權,合併目錄後要保證這個一致性
之前這麼乾過,也一直在用,但是網路上沒怎麼見過這麼乾的,^_^
姿勢E:直接下載 編譯過的包 部署到 /usr/local/node 並修改 環境變數 $PATH
【推薦指數:★☆☆☆☆】
還是這個node包,另一種使用方式是整個包的使用,而不是像姿勢D中那樣拆開了
ganiks@ganiks-ubuntu-trusty-64:~$ sudo cp node-v10.15.0-linux-x64 /usr/local/node -r #用root用戶修改系統文件,修改$PATH(永久生效,所有用戶生效) root@ganiks-ubuntu-trusty-64:~/node-install# vim /etc/environment PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/node/bin" #修改sudoers配置,否則普通用戶沒法用 sudo npm root@ganiks-ubuntu-trusty-64:~/node-install# vim /etc/sudoers Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin" Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/usr/local/node/bin"
總結:
姿勢A:【推薦指數:★★★☆☆】源碼編譯安裝(慢哦慢,還要小心你的記憶體)
姿勢B:【推薦指數:★★★★★】添加PPA 用Ubuntu的方式安裝(不錯,這個方式很ubuntu)
姿勢C:【推薦指數:★★★★★】用NPM模塊【n】更新Node和NPM(不錯,這個方式很快,多版本管理更方便)
姿勢D:【推薦指數:★★★☆☆】直接下載編譯過的包 分別部署到 /usr/local/bin 以及 /usr/local/lib/node_modules(還行,有點雞賊)
姿勢E:【推薦指數:★☆☆☆☆】直接下載 編譯過的包 部署到 /usr/local/node 並修改 環境變數 $PATH(感覺像是Mount掛在系統上,而不是Installatioin,不建議)
更新於2019.01.19