node-sass 埋坑記錄
背景
原有項(xiàng)目、環(huán)境:
node:v8.16.2
npm:v6.4.1
node-sass::v4.8.0
Angular-CLI:v6.x
本機(jī)沒(méi)有安裝 Visual Studio
以上是涉及到的工具的版本,可正常使用,項(xiàng)目運(yùn)行良好。
后來(lái),接手的新項(xiàng)目中:
Angular-CLI:v8.x
由于升級(jí)了 Angular 版本,同樣也升級(jí)了 Angular-CLI 版本,導(dǎo)致 v8.x 版本的 node 已經(jīng)無(wú)法編譯 angular 項(xiàng)目,至少需要使用 node v10.x 版本。
無(wú)奈,升級(jí)了 node 版本,隨之而來(lái)的就是 node-sass v4.8.0 版本無(wú)法使用,又導(dǎo)致構(gòu)建失敗,所以又得安裝新版本 node-sass。
但 node-sass 新版本安裝過(guò)程卻又報(bào)找不到 Python 環(huán)境錯(cuò)誤,導(dǎo)致 install 失敗。
好不容易在本地安裝了 Python 環(huán)境,又報(bào)了個(gè) MSB4132:無(wú)法識(shí)別工具版本 2.0 的錯(cuò)誤。
在網(wǎng)上查了半天,跟著改,卻又出現(xiàn)新錯(cuò)誤 MSB4019:Microsoft.Cpp.Default.props 找不到的錯(cuò)誤。
找了下,發(fā)現(xiàn)是因?yàn)楸緳C(jī)沒(méi)有 VS C++ 的編輯工具,可以借助:
npm install -g --production windows.build.tools
來(lái)下載安裝,試了下,發(fā)現(xiàn)是需要聯(lián)網(wǎng)才行,辦公網(wǎng)絡(luò)沒(méi)外網(wǎng)。
官網(wǎng)看了半天,找到了下載離線(xiàn)安裝包方式、結(jié)果卻是 2019 版本,太新,項(xiàng)目仍舊報(bào)錯(cuò)。
(what the fuck!
相關(guān)異常
- error MSB4019
gyp info spawn xxx
error MSB4019:未找到導(dǎo)入的項(xiàng)目 "E:\Microsoft.Cpp.Default.props"。請(qǐng)確認(rèn) <Import> 聲明中的路徑正確,且磁盤(pán)上存在該文件
gyp ERR! stack Error `C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe` failed with exit code: 1
- error MSB4132
gyp verb Not using VS2017: Could not use PowerShell to find VS2017
...
gyp verb could not find "msbuild.exe" in PATH - finding location in registry
...
MSBUILD : error MSB4132: 無(wú)法識(shí)別工具版本“2.0”。可用的工具版本為 "4.0"。
- python not found
gyp verb check python checking for Python executable "python2" in the PATH
gyp verb `which` failed Error: not found: python2
- a bug in node-gyp
gyp ERR! This is a bug in `node-gyp`.
gyp ERR! Try to update node-gyp and file an Issue if it does not help
分析
歸根結(jié)底,就是因?yàn)檗k公網(wǎng)絡(luò)被限制訪(fǎng)問(wèn)外網(wǎng)導(dǎo)致。
畢竟升級(jí)了 angular 大版本,隨之而來(lái)的一些依賴(lài)庫(kù)也需要跟著升級(jí),這無(wú)可厚非,可以理解,所以當(dāng)讓我也升級(jí) node-sass 時(shí),我沒(méi)啥反感。
但誰(shuí)知道,node-sass 新版的下載需要依賴(lài) C++ 的編譯環(huán)境、需要依賴(lài) python 環(huán)境,雖然到這里有點(diǎn)煩了,但還好,網(wǎng)上也很多人出現(xiàn)這問(wèn)題,解決方案不難,如下:
npm install --global --production windows-build-tools
windows-build-tools 的介紹可以看看官方網(wǎng)站:
https://www.npmjs.com/package/windows-build-tools
這條命令,其實(shí)就是會(huì)自動(dòng)去聯(lián)網(wǎng)下載 Visual C++ Build Tools 和安裝 Python 2.7 環(huán)境,一鍵式命令。
但,我的辦公網(wǎng)絡(luò)無(wú)法訪(fǎng)問(wèn)外網(wǎng)啊!
雖然有內(nèi)網(wǎng)的 Npm 倉(cāng)庫(kù),但也只下載了 windows-build-tools 這個(gè)包,這包里是一堆去訪(fǎng)問(wèn)外網(wǎng)下載東西的腳本啊,對(duì)我來(lái)說(shuō),這解決方案沒(méi)用啊!
無(wú)奈下,只能自己安裝,Python 還好,網(wǎng)上搜一下,安裝 + 配置環(huán)境變量即可。
問(wèn)題就在于 Visual C++ Build Tools,這個(gè) Mircosoft 的東西,要搞離線(xiàn)安裝,是真的麻煩。
這里有官方的教程(雖然沒(méi)怎么看懂),以及網(wǎng)上大佬的教程,鏈接都貼出來(lái),我這里就大概講講,感興趣,自行查閱:
小結(jié)
之所以以前正常,新項(xiàng)目出現(xiàn)種種問(wèn)題,原因在于各環(huán)境的版本升級(jí),所以,需要明確,各個(gè)環(huán)境、框架之間都是有依賴(lài)關(guān)系的,不是任意版本組合就可以的,比如:
angular v8 版本就需要依賴(lài) angular-cli 到 v8.x 版本;
angular-cli v8.x 版本就需要依賴(lài) node 到 v10.x 版本;
node-sass v4.8 只支持到 node v9 版本;
所以,當(dāng)需要升級(jí) angular 版本時(shí),請(qǐng)注意這些事項(xiàng),具體的依賴(lài)關(guān)系,請(qǐng)到各自的官網(wǎng)中查看說(shuō)明。
解決方案
能聯(lián)網(wǎng)
- 先升級(jí) angular 版本,再升級(jí) angular-cli 版本
- 構(gòu)建失敗時(shí),會(huì)提示請(qǐng)升級(jí) node 版本,按提示升級(jí),可通過(guò) nvm 或手動(dòng)下載新版本 node
- 繼續(xù)構(gòu)建時(shí),node-sass 下載失敗
- 請(qǐng)先確認(rèn)是否是鏡像問(wèn)題,可以手動(dòng)在瀏覽器地址欄輸入 node-sass 下載的地址(可在 package.json.lock 中查看),看是否能夠找到對(duì)應(yīng)版本的 node-sass
- 出現(xiàn)文章開(kāi)頭說(shuō)過(guò)的幾種 node-sass 編譯錯(cuò)誤時(shí),注意日志,根據(jù)不同錯(cuò)誤,搜索相關(guān)關(guān)鍵詞,按網(wǎng)上教程解決,通常來(lái)說(shuō)就是沒(méi)有 python 環(huán)境、沒(méi)有 c++ 編譯工具、vs 版本過(guò)高等問(wèn)題,可以試試通過(guò) npm 安裝 windows-build-tools 來(lái)自動(dòng)下載安裝這些工具試試
建議多去相關(guān)庫(kù)的 github 的 issue 里找找,通常都能找到你遇到的問(wèn)題
不能聯(lián)網(wǎng)
辦公網(wǎng)絡(luò)通常無(wú)法訪(fǎng)問(wèn)外網(wǎng),但都會(huì)有自己內(nèi)部的鏡像倉(cāng)庫(kù),所以下載基本的 node 之類(lèi)的庫(kù)是沒(méi)有問(wèn)題的,上面的解決步驟也一樣可以參考執(zhí)行。
不能訪(fǎng)問(wèn)外網(wǎng)最重要的一點(diǎn)就是,windows 的東西沒(méi)法下載,比如上面的 windows-build-tools 自動(dòng)去下載 vs c++ 的編譯工具就下載不了。
這時(shí)候,如果需要,那就只能在能訪(fǎng)問(wèn)外網(wǎng)的機(jī)子上,將 vs studio 相關(guān)東西先下載下來(lái),再用離線(xiàn)方式進(jìn)行安裝。
其實(shí),我最后即使離線(xiàn)安裝了 vs studio 2019 的版本之后,node-sass 仍舊還是下載失敗,最后,實(shí)在沒(méi)時(shí)間去研究了,干脆在能訪(fǎng)問(wèn)外網(wǎng)的機(jī)子上面,也安裝同版本的 node,然后成功下載好 node-sass 之后,將這個(gè) node-sass 包直接拷貝到辦公機(jī)子上面使用了。
參考鏈接
以下是很多很多的鏈接,有的有提出解決方案,有的沒(méi)有,自取: