一文解决所有node-gyp报错

前言

这几天搞 canvas 项目迁移,执行npm install canvas就报各种node-gypnode-pre-gyp的错误,什么样的错误都有,而且一报还报一大堆刷屏,期间踩了各种 python、 vs 的 坑,真的神烦!!跟姐妹说我每天都想揍人,她学中医,推荐吃了加味逍遥丸,服用两天后心平气和,摆脱了尘世的欲望,能让我更能沉下心来解决这个问题。

先展示一下,成功安装的截图

demo

安装成功后,没想到就这么几行反馈信息,当时还不可置信的怀疑自己在梦里。好,废话太多,原谅我太兴奋了~开始正题

环境除了 node 不多说,必须要装 python 和 visual studio,以下是我的环境,不必和我环境对齐,仔细看报错信息即可。

node v16.13.0
npm 8.1.4
node-gyp v8.4.1
Python 3.10.12

visual studio community 2022
windows 11

配置环境

python

每个 node-gyp 适配的 python 版本不一样,一定要认真读报错,他会告诉你是用什么 python 版本,大多数都是 python3+。这里推荐安装anaconda对 python 版本进行管理。

装完后,命令行检查

python --version

没有输出版本号,就去配环境变量

visual studio

node-gyp 报错原因,大部分都是因为 visual studio 没安装好,按照下面的步骤逐一核对,每一步配置完成可install试试

1. 核对安装路径

网上很多文章都让直接npm install --global --production windows-build-tools --vs2015就好,但我没生效,这里见仁见智,如果你之前没装过 vs 可以试试。

新安装 visual studio 最好使用默认路径,如果你早就安装了但改变了安装位置,最好完全卸载后重新安装(有可能改变安装位置的时候,输入框置灰,这时要更改注册表,参考Visual Studio 2019,2017,2022 安装时,共享组件、工具和 SDK 的路径不能更改)我一直装不上的原因,就是因为 vs 装在 D 盘了,node-gyp 一直没找到 package 目录。。。

2. 指定 msvs_version 和 msbuild_path

网上很多文章都只让设置 msvs_version 而 没设置msbuild_path,这两个东西看你报错进行指定,如果他说你没指定 msvs_version 版本号,就

npm config set msvs_version=2022

如果他说,找不到“visual Studio C++ core features”啊,或是报你 “msvs_version 和 VS Command Prompt 版本不匹配啊” 都是没设置 msbuild_path,node-gyp 很傻的~

npm config set msbuild_path "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe"

3. 找不到 windows sdk

这是困扰我一上午的问题,有两个原因

(1)没安装 windows sdk

打开 visual studio installer(windows 直接搜),找到已安装的 vs 后,点击修改,找到你系统的 sdk,安装,如下

demo

之后 install 即可

(2)已安装 windows sdk,但报错还是说 missing any Windows SDK

进入你 vs 安装目录,根据你的系统版本,全局搜索文件名,参照下面的文件名。比如我是 win11,我就在这个目录里搜 “Microsoft.VisualStudio.Component.Windows11SDK”

// 以下为node-gyp源码,他找sdk会按照安装目录下查找以下prefix。。所以你package或shared目录装到了其他目录下,他就找不到,特别傻。。
getSDK: function getSDK(info) {
    const win8SDK = 'Microsoft.VisualStudio.Component.Windows81SDK'
    const win10SDKPrefix = 'Microsoft.VisualStudio.Component.Windows10SDK.'
    const win11SDKPrefix = 'Microsoft.VisualStudio.Component.Windows11SDK.'

    // ...
}

如果没找到,就说明你 package 目录有问题,先检查一下报错信息,是不是有 VCINSTALLDIR not set, not running in VS Command Prompt,在 VS Command Prompt 中用 admin 权限打开,写入环境变量:

SET VSINSTALLDIR=C:\Program Files\Microsoft Visual Studio\2022\Community\

之后在 cmd 中,键入set,查看是否设置成功,再 install 一下。如果还不行,还是报 vs 相关的错误的话,仔细阅读报错,只能完全卸载 vs 后重装了。

总结

这个坑最终解下来非常有成就感,自己也在配置的期间,熟悉了很多命令行,还看了 node-gyp 的部分源码。其实自己一直没解开的原因是,没有全部看完报错信息,眼睛先扫 throw stack Error 的那一行,忽略了前面的日志。明明人家给你了日志,却让自己在一个黑盒里瞎解、盲试,导致耽误了太多太多的时间~ 期间查阅了很多 github 和 stackoverfow 的回答,有的问题也没解开,最终无奈下去查源码,才发现了自己的问题。 以这文警醒自己不要太过浮躁,遇到问题,稳住!