[TOC]
问题背景
开发新的前端我的项目时,总少不了搭建开发环境和执行npm install装置依赖包,但npm install的过程总是充斥着玄学,很难保障一次性胜利,其中尤其以node-sass
这个包的装置失败问题最为常见。
像其余npm包装置失败,通常是因为网络问题,能够采纳应用更好的网络环境或者切换源的形式进行装置,比方应用淘宝的源进行装置,命令如下:
npm install --registry=https://registry.npm.taobao.org
但node-sass
装置失败这个问题仿佛无奈通过上述命令解决。本文将总结遇到此类问题时的解决方案。
问题形容
笔者的测试环境如下:
操作系统:Windows 11Node版本:v14.16.0Npm版本:6.14.11
遇到的node-sass
装置失败的报错如下:
gyp ERR! find VSgyp ERR! find VS msvs_version not set from command line or npm configgyp ERR! find VS VCINSTALLDIR not set, not running in VS Command Promptgyp ERR! find VS checking VS2022 (17.5.33530.505) found at:gyp ERR! find VS "D:\Program Files\Microsoft Visual Studio\2022\Community"gyp ERR! find VS - found "Visual Studio C++ core features"gyp ERR! find VS - found VC++ toolset: v143gyp ERR! find VS - missing any Windows SDKgyp ERR! find VS could not find a version of Visual Studio 2017 or newer to usegyp ERR! find VS looking for Visual Studio 2015gyp ERR! find VS - not foundgyp ERR! find VS not looking for VS2013 as it is only supported up to Node.js 8gyp ERR! find VSgyp ERR! find VS **************************************************************gyp ERR! find VS You need to install the latest version of Visual Studiogyp ERR! find VS including the "Desktop development with C++" workload.gyp ERR! find VS For more information consult the documentation at:gyp ERR! find VS https://github.com/nodejs/node-gyp#on-windowsgyp ERR! find VS **************************************************************gyp ERR! find VSgyp ERR! configure errorgyp ERR! stack Error: Could not find any Visual Studio installation to usegyp ERR! stack at VisualStudioFinder.fail (D:\temp\npm-temp\node_modules\node-gyp\lib\find-visualstudio.js:122:47)gyp ERR! stack at D:\temp\npm-temp\node_modules\node-gyp\lib\find-visualstudio.js:75:16gyp ERR! stack at VisualStudioFinder.findVisualStudio2013 (D:\temp\npm-temp\node_modules\node-gyp\lib\find-visualstudio.js:363:14)gyp ERR! stack at D:\temp\npm-temp\node_modules\node-gyp\lib\find-visualstudio.js:71:14gyp ERR! stack at D:\temp\npm-temp\node_modules\node-gyp\lib\find-visualstudio.js:384:16gyp ERR! stack at D:\temp\npm-temp\node_modules\node-gyp\lib\util.js:54:7gyp ERR! stack at D:\temp\npm-temp\node_modules\node-gyp\lib\util.js:33:16gyp ERR! stack at ChildProcess.exithandler (child_process.js:315:5)gyp ERR! stack at ChildProcess.emit (events.js:315:20)gyp ERR! stack at maybeClose (internal/child_process.js:1048:16)gyp ERR! System Windows_NT 10.0.22621gyp ERR! command "C:\\Users\\zzcoder\\AppData\\Local\\nvs\\default\\node.exe" "D:\\temp\\npm-temp\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="gyp ERR! cwd D:\temp\npm-temp\node_modules\node-sassgyp ERR! node -v v14.16.0gyp ERR! node-gyp -v v8.4.1gyp ERR! not okBuild failed with error code: 1npm WARN npm-test@1.0.0 No descriptionnpm WARN npm-test@1.0.0 No repository field.npm ERR! code ELIFECYCLEnpm ERR! errno 1npm ERR! node-sass@8.0.0 postinstall: `node scripts/build.js`npm ERR! Exit status 1npm ERR!npm ERR! Failed at the node-sass@8.0.0 postinstall script.npm ERR! This is probably not a problem with npm. There is likely additional logging output above.npm ERR! A complete log of this run can be found in:npm ERR! C:\Users\zzcoder\AppData\Roaming\npm-cache\_logs\2023-05-06T06_13_42_083Z-debug.log
附上报错截图:
解决方案
1. 查看node-sass
装置版本是否正确。
本地装置的node
版本不同,须要装置的node-sass
版本也是不一样的。node-sass
官网给出了不同版本的node
和node-sass
的对应关系,读者可拜访node-sass github仓库或者node-sass npm仓库进行查看。
本地装置的node
版本,能够应用如下命令进行查看:
node -v
下图为截至node-sass@8.0.0
版本时的对应关系。
在我的项目中还没有package.json
或者有package.json
然而此文件没有指定node-sass
的版本时,默认会装置node-sass
的最新版本。因为笔者装置的node
版本时14.16.0
,执行npm install node-sass
命令默认装置了撰写本文时的node-sass
最新版本8.0.0
,所以才有了前文中报错。
依据版本对应关系,笔者应该装置node-sass
的4.14+
版本,因而须要将装置命令改为:
npm install node-sass@^4.14.0 --registry=https://registry.npm.taobao.org
这样就是应用淘宝源
来装置node-sass
的4.14+
中的最新版本。
2. 查看是否是网络问题
在应用npm install
装置node-sass
时,会从 github.com
上下载 .node
文件。因为国内网络环境的问题,这个下载工夫可能会很长,甚至导致超时失败。
npm WARN deprecated @npmcli/move-file@2.0.1: This functionality has been moved to @npmcli/fsnpm WARN deprecated @npmcli/move-file@1.1.2: This functionality has been moved to @npmcli/fs> node-sass@8.0.0 install D:\temp\npm-temp\node_modules\node-sass> node scripts/install.jsDownloading binary from https://github.com/sass/node-sass/releases/download/v8.0.0/win32-x64-83_binding.nodeCannot download "https://github.com/sass/node-sass/releases/download/v8.0.0/win32-x64-83_binding.node":HTTP error ETIMEDOUT request to https://github.com/sass/node-sass/releases/download/v8.0.0/win32-x64-83_binding.node failed, reason: connect ETIMEDOUT 20.205.243.166:443Hint: If github.com is not accessible in your location try setting a proxy via HTTP_PROXY, e.g. export HTTP_PROXY=http://example.com:1234or configure npm proxy via npm config set proxy http://example.com:8080> node-sass@8.0.0 postinstall D:\temp\npm-temp\node_modules\node-sass> node scripts/build.js
附上报错截图。
这种状况下仅应用--registry
参数指定npm包的下载源是不够的,还须要应用--sass_binary_site
参数指定sass二进制文件的下载源,因而须要将装置命令改为:
npm install node-sass@^4.14.0 --registry=https://registry.npm.taobao.org --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
这样一来就是指定node-sass版本,指定npm包下载源为淘宝源,指定sass下载源为淘宝源,应用此命令根本就都能装置胜利了。
总结
遇到node-sass装置失败时,能够应用以下命令:
# 查看本地node版本node -v# 装置node-sassnpm install node-sass@[本地node所对应的node-sass版本] --registry=https://registry.npm.taobao.org --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
通过下表查看版本对应关系,也可拜访node-sass github仓库或者node-sass npm仓库进行查看。
欢送批评指正。