node-sass 埋坑記錄
背景
原有項目、環境:
node:v8.16.2
npm:v6.4.1
node-sass::v4.8.0
Angular-CLI:v6.x
本機沒有安裝 Visual Studio
以上是涉及到的工具的版本,可正常使用,項目運行良好。
后來,接手的新項目中:
Angular-CLI:v8.x
由於升級了 Angular 版本,同樣也升級了 Angular-CLI 版本,導致 v8.x 版本的 node 已經無法編譯 angular 項目,至少需要使用 node v10.x 版本。
無奈,升級了 node 版本,隨之而來的就是 node-sass v4.8.0 版本無法使用,又導致構建失敗,所以又得安裝新版本 node-sass。
但 node-sass 新版本安裝過程卻又報找不到 Python 環境錯誤,導致 install 失敗。
好不容易在本地安裝了 Python 環境,又報了個 MSB4132:無法識別工具版本 2.0 的錯誤。
在網上查了半天,跟着改,卻又出現新錯誤 MSB4019:Microsoft.Cpp.Default.props 找不到的錯誤。
找了下,發現是因為本機沒有 VS C++ 的編輯工具,可以借助:
npm install -g --production windows.build.tools
來下載安裝,試了下,發現是需要聯網才行,辦公網絡沒外網。
官網看了半天,找到了下載離線安裝包方式、結果卻是 2019 版本,太新,項目仍舊報錯。
(what the fuck!
相關異常
- error MSB4019
gyp info spawn xxx
error MSB4019:未找到導入的項目 "E:\Microsoft.Cpp.Default.props"。請確認 <Import> 聲明中的路徑正確,且磁盤上存在該文件
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: 無法識別工具版本“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
分析
歸根結底,就是因為辦公網絡被限制訪問外網導致。
畢竟升級了 angular 大版本,隨之而來的一些依賴庫也需要跟着升級,這無可厚非,可以理解,所以當讓我也升級 node-sass 時,我沒啥反感。
但誰知道,node-sass 新版的下載需要依賴 C++ 的編譯環境、需要依賴 python 環境,雖然到這里有點煩了,但還好,網上也很多人出現這問題,解決方案不難,如下:
npm install --global --production windows-build-tools
windows-build-tools 的介紹可以看看官方網站:
https://www.npmjs.com/package/windows-build-tools
這條命令,其實就是會自動去聯網下載 Visual C++ Build Tools 和安裝 Python 2.7 環境,一鍵式命令。
但,我的辦公網絡無法訪問外網啊!
雖然有內網的 Npm 倉庫,但也只下載了 windows-build-tools 這個包,這包里是一堆去訪問外網下載東西的腳本啊,對我來說,這解決方案沒用啊!
無奈下,只能自己安裝,Python 還好,網上搜一下,安裝 + 配置環境變量即可。
問題就在於 Visual C++ Build Tools,這個 Mircosoft 的東西,要搞離線安裝,是真的麻煩。
這里有官方的教程(雖然沒怎么看懂),以及網上大佬的教程,鏈接都貼出來,我這里就大概講講,感興趣,自行查閱:
小結
之所以以前正常,新項目出現種種問題,原因在於各環境的版本升級,所以,需要明確,各個環境、框架之間都是有依賴關系的,不是任意版本組合就可以的,比如:
angular v8 版本就需要依賴 angular-cli 到 v8.x 版本;
angular-cli v8.x 版本就需要依賴 node 到 v10.x 版本;
node-sass v4.8 只支持到 node v9 版本;
所以,當需要升級 angular 版本時,請注意這些事項,具體的依賴關系,請到各自的官網中查看說明。
解決方案
能聯網
- 先升級 angular 版本,再升級 angular-cli 版本
- 構建失敗時,會提示請升級 node 版本,按提示升級,可通過 nvm 或手動下載新版本 node
- 繼續構建時,node-sass 下載失敗
- 請先確認是否是鏡像問題,可以手動在瀏覽器地址欄輸入 node-sass 下載的地址(可在 package.json.lock 中查看),看是否能夠找到對應版本的 node-sass
- 出現文章開頭說過的幾種 node-sass 編譯錯誤時,注意日志,根據不同錯誤,搜索相關關鍵詞,按網上教程解決,通常來說就是沒有 python 環境、沒有 c++ 編譯工具、vs 版本過高等問題,可以試試通過 npm 安裝 windows-build-tools 來自動下載安裝這些工具試試
建議多去相關庫的 github 的 issue 里找找,通常都能找到你遇到的問題
不能聯網
辦公網絡通常無法訪問外網,但都會有自己內部的鏡像倉庫,所以下載基本的 node 之類的庫是沒有問題的,上面的解決步驟也一樣可以參考執行。
不能訪問外網最重要的一點就是,windows 的東西沒法下載,比如上面的 windows-build-tools 自動去下載 vs c++ 的編譯工具就下載不了。
這時候,如果需要,那就只能在能訪問外網的機子上,將 vs studio 相關東西先下載下來,再用離線方式進行安裝。
其實,我最后即使離線安裝了 vs studio 2019 的版本之后,node-sass 仍舊還是下載失敗,最后,實在沒時間去研究了,干脆在能訪問外網的機子上面,也安裝同版本的 node,然后成功下載好 node-sass 之后,將這個 node-sass 包直接拷貝到辦公機子上面使用了。
參考鏈接
以下是很多很多的鏈接,有的有提出解決方案,有的沒有,自取: