看完这篇文章,也许你的 Windows 编译小技能又能增加不少 ── 精通各种 Windows 编译工具的安装 💩️。
相信不少人碰到了编译 Node.js 原生组件的问题,以前可以通过 npm install -g windows-build-tools
安装 Windows 下的编译工具,安装好后安装 python2.7 或者 python3.9 就可以了。
现在不知道什么原因,之前通过 npm 安装了 windows-build-tools 之后一直都正常,现在突然不行了🌚。
如上图,一直提示需要管理员权限,但这个窗口如图片顶部那样,已经是管理员了,怎么试都不行💩️。如 windows-build-tools 官方提示的那样,已经不怎么维护了。
如上图中的声明,使用 Node.js 官方的安装包,勾选下面的选项后,就可以帮你安装 Python 和 C++ 编译工具。
然而... 无法创建类型。此语言模式仅支持核心类型。(中文都看不懂🙃️)
换个思路,既然那之前都装了 windows-build-tools,那是不是可以直接用呢。创建了一个空目录,安装需要编译原生组件的包 node-pty,(这是一个通过 Node.js 原生组件的形式转接 terminal 的内容,输出到 JavaScript 中的模块)。
然后就出现了,乱码,看不懂。我记得之前碰到过中文 Windows 系统命令行使用的是 gb2312 的编码,所以可以通过 chcp 65001
切换为 utf8 显示内容,于是我转换了一下看看:
单词看明白了,组合在一起看不明白🌚,权限不够,不可能吧。有点没有头绪,看到上图中的 not supported in this language mode ,有可能还是第一个问题导致的,那就先尝试解决第一个问题吧,「无法创建类型。此语言模式仅支持核心类型」。发现在微软的 Powershell Blog 中找到了一个原因(文末链接),通过在 PowerShell 里执行:$ExecutionContext.SessionState.LanguageMode
发现当前是 ConstrainedLanguage,所以不能“创建类型”。
但当我用 $ExecutionContext.SessionState.LanguageMode = "FullLanguage"
设置的时候🌚:
也就是说,可以设置为 ConstrainedLanguage 模式,但不能设置回去了。再找一下,需要去注册表管理器设置才行,把 __PSLockdownPolicy
设置为 8 才行。注册表路径:计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
(如果没有这个键,需要手动新建一下)。
为啥?十进制 4 代表 ConstrainedLanguage, 8 代表 FullLanguage。可以尝试在 Powershell 中输入 $Env: __PSLockownPolicy
返回的就是 4,如果设置了 FullLanguage,返回的是 8。既然好了,可以再试一下是否正常安装,我的还是出现了找不到 Build Tools 的问题(大部分情况下重新编译原生组件就好了)。
那我们再安装一下 Build Tools 2019?
我这是先从 Microsoft 中下载了 Visual Studio 2019 Build Tools ,然后发现还是报错。Build Tools 2019 的下载方式是:先去这个 Visual Studio 官网下载页,然后搜索 2019 就可以了,下载“Visual Studio 2019 生成工具”,安装后安装“使用 C++ 的桌面开发” 这个组合,取消右侧那些可选的工具,只保留红框的工具即可:
安装好后,那试一下安装 node-pty?先做如下设置,确保只使用 Windows Build Tools 2019:
VCINSTALLDIR
环境变量为 C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current
(注意这个最后认定是错误的)npm config set msvs_version 2019
很好,出来了一个新的错误,我就在想,明明已经做了上面的设置,为何还是找不到 2019 的版本呢?有些没有头绪了 🙃️。
吃晚饭去听了「仲夏之夜•阿里技术节」后,那就沉下去,看看源码吧。如上图,之所以识别不了报错是因为这个原因:could not find a version of Visual Studio 2017 or newer to user
而源码在这里:C:\nodejs\node_modules\npm\node_modules\node-gyp\lib\find-visualstudio.js
。
发现源码里面两个路径不一样:C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild
和 C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools
,所以是看起来是我设置的环境变量的锅:VCINSTALLDIR
,应该是 C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild
。因为拿到这个环境变量后,就先把子目录去掉了。最后如下图:
大功告成,踩坑需谨慎。
总结两种比较好的安装 Windows 编译工具的方法:
目前最靠谱的方法,还是通过 Node.js 安装包的方式 https://nodejs.org,运行后勾选 "Automatically install the necessary tools" ,自动安装好 Python 和 Windows 编译工具
npm config set msvs_version 2019
(可以通过 npm config list
获取设置的位置)之后就可以正常的安装包了吧。
往期推荐
一文速览 TypeScript 装饰器 与 IoC 机制