noge-gyp构建项目踩坑记录

开发环境
系统: win11
node: 19.7.0
npm: 8.3.2
node-gyp: 10.0.2

可以不使用windows-build-tools来安装构建工具,手动进行安装

我这边用windows-build-tools安装时候会提示

'process.env' only accepts a configurable, writable, and enumerable data descriptor.

查了资料后加上dd_clint.log这个文件也没有用

再加上这个构建工具中用的Python还是2.7版本的,太旧了,所以选择手动安装构建工具

1、安装Visual Studio 2022

需要勾选"使用C++的桌面开发",“MSVC v143 - VS 2022 C++ x64/x86 生成工具(最新)”,“Windows 11 SDK(10.0.22000.0)”,这个SDK后面的数字怎么选下面会介绍
image-20240829101649626
image-20240829101743932
image-20240829102020482

查看Windows版本

在搜索栏输入"系统信息"

image-20240829102242367
image-20240829102232006

我的系统是Win11,版本是10.0.22000,对应的SDK就是Windows 11 SDK(10.0.22000.0)

设置环境变量

下载完后添加环境变量VCINSTALLDIR,路径设置图中这个

image-20240829102523310

2、安装node-gyp

安装命令:npm install -g node-gyp

因为我用的是nvm来管理多个nodejs,安装完后找不到node-gyp,还需要加上环境变量(我的电脑>右键>属性>高级系统设置>环境变量>系统变量>Path>编辑>新建)

E:\nvm\v19.7.0\node_global

3、node-gyp构建模块

默认node-gyp下载编译需要的头文件是从nodejs官网下载的经常会因为网络问题下载失败。

FetchError: request to https://nodejs.org/download/release/v19.7.0.....

可以在npmrc中设置

disturl = "https://npmmirror.com/mirrors/node"

或者在执行node-gyp命令的时候加上以下参数

--disturl=https://npmmirror.com/mirrors/node

通过淘宝的镜像网站下载头文件,可能某些版本node的头文件淘宝镜像没有,可以从其他网站镜像寻找配置

开始构建模块

node-gyp configure --disturl=https://npmmirror.com/mirrors/node

问题1:msvs_version not set,VCINSTALLDIR not set,not found Visual Studio

执行指令

npm config set msvs_version 2022
set VCINSTALLDIR <Visual Studio安装路径>

执行完一定要检查一下

$ npm config get msvs_version
2022
$ echo %VCINSTALLDIR%
E:\Microsoft Visual Studio\2022\Community\VC
问题2:msvs_version not set,VCINSTALLDIR not set,not found Visual Studio

大意是msvs_version变量取到了,但是VCINSTALLDIR 还是没有set。

解决办法:

  1. 手动设置系统的环境变量(我的电脑>右键>属性>高级系统设置>环境变量>新建系统变量)
  2. vscode所属的terminal,echo %VCINSTALLDIR%返回的值都不符合预期。
    但windows自带的cmd.exe是可以取到VCINSTALLDIR的值。
问题3:unknown version “undefined” found

node-gyp寻找Visual Studio的文件是下面这个

E:\nvm\v19.7.0\node_global\node_modules\node-gyp\lib\find-visualstudio.js

用vscode打开,加入以下代码后调试运行(勾选上捕获异常)

debugger;
// 第一个参数是node的版本
// 第二个参数是Visual Studio的版本
findVisualStudio('19.7.0', '2022', (result) => { console.log(result); 
});

image-20240829105440267

查找Visual Studio命令的构建在findNewVS这个函数下,最后发现是执行命令报错,导致JSON.parse(stdout),这一行命令在解析的时候出现问题

手动把构建的命令复制出来,在PowerShell执行发现是从环境变量中的用户变量lib读取到了不存在的路径

E:\Microsoft Visual Studio\VC98\mfc\lib
E:\Microsoft Visual Studio\VC98\lib

这个是因为我之前安装过Visual C++,后续文件夹删除了,但是环境变量没有删除,导致node-gyp寻找Visual Studio时出错,所以将环境变量删除即可

问题4:does not match this Visual Studio Command Prompt

解决办法1: 在 C:\Users\Admin\.npmrc (找不到这个文件的用Everything搜一下)文件中添加上msvs_version=2022

我的.npmrc文件设置如下

cache=E:\nodejs\node_cache
msvs_version=2022
node_gyp=E:\nodejs\node_global\node_modules\node-gyp\bin\node-gyp.js
prefix=E:\nodejs\node_global
registry=https://registry.npm.taobao.org/
sass_binary_site=https://npmmirror.com/mirrors/node-sass
strict-ssl=false

解决办法2: 在构建的时候加上 --msvs_version=2022,比如:node-gyp configure --msvs_version=2022

问题5:Could not find any Visual Studio installation to use

在安装了Windows11 SDK后出现这个问题是因为node-gyp没有找到Windows11 SDK

node-gyp寻找SDK的文件是下面这个

E:\nvm\v19.7.0\node_global\node_modules\node-gyp\lib\find-visualstudio.js

里面有一个函数getSDK,将其修改即可

// Helper - process Windows SDK informationgetSDK (info) {const win8SDK = 'Microsoft.VisualStudio.Component.Windows81SDK'const win10SDKPrefix = 'Microsoft.VisualStudio.Component.Windows10SDK.'const win11SDKPrefix = 'Microsoft.VisualStudio.Component.Windows11SDK.'let Win10or11SDKVer = 0info.packages.forEach((pkg) => {if (!pkg.startsWith(win10SDKPrefix) && !pkg.startsWith(win11SDKPrefix)) {return}const parts = pkg.split('.')if (parts.length > 5 && parts[5] !== 'Desktop') {this.log.silly('- ignoring non-Desktop Win10/11SDK:', pkg)return}const foundSdkVer = parseInt(parts[4], 10)if (isNaN(foundSdkVer)) {// Microsoft.VisualStudio.Component.Windows10SDK.IpOverUsbthis.log.silly('- failed to parse Win10/11SDK number:', pkg)return}this.log.silly('- found Win10/11SDK:', foundSdkVer)Win10or11SDKVer = Math.max(Win10or11SDKVer, foundSdkVer)})if (Win10or11SDKVer !== 0) {return `10.0.${Win10or11SDKVer}.0`} else if (info.packages.indexOf(win8SDK) !== -1) {this.log.silly('- found Win8SDK')return '8.1'}return 

参考资料:

  1. https://juejin.cn/post/7132125416034140173
  2. https://stackoverflow.com/questions/70315519/node-gyp-error-could-not-find-any-visual-studio-installation-to-use
  3. https://blog.csdn.net/qq_36888550/article/details/133287592
  4. https://blog.csdn.net/jhlovett/article/details/3969791
  5. https://github.com/nodejs/node-gyp/pull/2565
  6. https://juejin.cn/post/7042123168722452516

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转换视频格式轻松搞定!3个小窍门助你轻松将mxf格式转mp4

你是否因为格式转换而烦恼&#xff1f;你是否经历过这样的情况&#xff1a;你想要在别的设备或平台上播放心仪的视频&#xff0c;但是你的视频文件是xmf格式的&#xff0c;很多设备都不支持这个格式&#xff0c;导致视频无法播放。现在&#xff0c;你需要把mxf格式转mp4格式。你…

【时间盒子】-【2.准备】HarmonyOS 开发前需要准备什么?

零基础新手或转行进入鸿蒙生态应用的开发者&#xff0c;请提前准备以下内容&#xff1a; 一、注册华为帐号 此帐号在华为官方各平台通用&#xff0c;比如&#xff1a;华为手机、华为商城、华为云、华为开发者联盟等等。 https://id1.cloud.huawei.com/CAS/portal/userRegist…

如何在Windows和Mac上免费提取RAR文件?这里有方法

序言 你有没有下载过一个文件,却发现它有一个奇怪的.rar文件扩展名?RAR是一种压缩文件格式,与ZIP文件非常相似,在本文中,我们将向你展示如何在Windows或macOS上打开RAR文件。 如何在Windows 11上打开RAR文件 Windows 11在2023年增加了对RAR文件的原生支持。从那时起,你…

144. 腾讯云Redis数据库

文章目录 一、Redis 的主要功能特性二、Redis 的典型应用场景三、Redis 的演进过程四、Redis 的架构设计五、Redis 的数据类型及操作命令六、腾讯云数据库 Redis七、总结 Redis 是一种由 C 语言开发的 NoSQL 数据库&#xff0c;以其高性能的键值对存储和多种应用场景而闻名。本…

可重入VI,VI模板和动态VI之间的差异 转

可重入VI 当您想要同时运行同一VI的多个实例时&#xff0c;将使用可重入VI。当VI不可重入时&#xff0c;VI只有一个数据空间。因此&#xff0c;一次只能有一个调用者运行VI&#xff0c;因此调用者可能必须“等待轮到它”时才能使用VI。这是VI的默认选项&#xff0c;但您可以将V…

Hibernate 批量插入速度慢的原因和解决方法

由于业务需要一次性连续写入超过10k条以上的新数据&#xff0c;当对象超过10个成员变量以后&#xff0c;整个写入过程居然需要长达35秒&#xff0c;这个速度是不能接受的&#xff0c;故此研究了一下怎么开启Hibernate批量写入的功能。 我这边使用的是Hibernate 5.6.15 在网上…

【Java|Stream流】不可变集合

文章目录 1.什么是不可变集合2.创建不可变集合的方式2.1 List类型2.2 Set2.3 Map 1.什么是不可变集合 不可变集合:不可以被修改的集合 不可变集合优点: 安全性 由于不可变集合不能被修改&#xff0c;所以可以安全地在多个线程之间共享&#xff0c;而不用担心被意外修改&#xf…

【kubernetes】Service 介绍和应用

一&#xff0c;Service介绍 四层代理是基于传输层&#xff08;第四层&#xff09;工作的代理&#xff0c;主要在传输层&#xff08;如TCP、UDP协议&#xff09;上转发和管理数据流 七层代理是基于应用层&#xff08;第七层&#xff09;工作的代理&#xff0c;能够对应用层协议…

# 利刃出鞘_Tomcat 核心原理解析(十)-- Tomcat 性能调优--2

利刃出鞘_Tomcat 核心原理解析&#xff08;十&#xff09;-- Tomcat 性能调优–2 二、Tomcat专题 - Tomcat性能调优 - 性能测试结果说明 1、压力性能测试 # 打开另一个终端&#xff0c;切换目录 [rootbogon ~]# cd /usr/local/tomcat# 进行压力性能测试[rootbogon tomcat]# …

JSON处理库 -- Fastjson

文章目录 一、json格式1.1 用途1.2 语法1.3 常见格式 二、fastjson常用类2.1 JSONObject2.2 JSONArray 三、序列化和反序列化3.1 默认序列化与反序列化3.2 序列化的扩展3.3 自定义序列化SerializeFilter3.4 JSONField 注解3.5 复习Jackson 一、json格式 1.1 用途 一种轻量级的…

浅谈SpringMvc的核心流程与组件

一、SpringMvc的核心流程 当发起请求时被前置的控制器(DispatcherServlet)拦截到请求&#xff0c;根据请求参数生成代理请求&#xff0c;找到请求对应的实际控制器&#xff0c;控制器处理请求&#xff0c;创建数据模型&#xff0c;访问数据库&#xff0c;将模型响应给中心控制…

扑捉一只耿鬼(HTML文件)

图例&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>耿鬼</title><style>body {background: #fff;font-family: Comfortaa, sans-serif;}* {box-sizing:…

Unet改进12:添加PCONV||减少冗余计算和同时存储访问

本文内容:添加PCONV 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 为了设计快速的神经网络,许多工作都集中在减少浮点运算(FLOPs)的数量上。然而,我们观察到FLOPs的这种减少并不一定会导致类似程度的延迟减少。这主要源于低效率的每秒浮点操作数(FLOP…

Bean 的实例化(创建 | 获取)

Spring为Bean提供了多种实例化方式&#xff0c;包括如下4种方式&#xff1a; 第一种&#xff1a;通过构造方法实例化第二种&#xff1a;通过简单工厂模式实例化第三种&#xff1a;通过factory-bean实例化&#xff08;工厂方法模式实例化&#xff09;第四种&#xff1a;通过Fact…

盘点java8 stream中隐藏的函数式接口

shigen坚持更新文章的博客写手&#xff0c;记录成长&#xff0c;分享认知&#xff0c;留住感动。个人IP&#xff1a;shigen 提到函数式接口&#xff0c;最常见的就是lambda表达式&#xff0c;IDEA也有智能的提示&#xff1a; 最后改成这样的就是最简洁的、IDEA希望的风格&#…

Android UI绘制原理:UI的绘制流程是怎么样呢?为什么子线程不能刷新UI呢?讲解大体的流程是怎么样的

目录&#xff1a; 一、 为什么要学习android UI绘制原理呢&#xff1f;对我们有什么帮助&#xff1f; 1.解决复杂布局问题&#xff1a;了解UI绘制原理可以帮助我们更好地理解和解决布局问题&#xff0c;比如使用自定义View、优化布局层级等。 2.知道何时触发布局&#xff08;…

【AI大模型】基于docker部署向量数据库Milvus和可视化工具Attu详解步骤

&#x1f680; 作者 &#xff1a;“大数据小禅” &#x1f680; 文章简介 &#xff1a;本专栏后续将持续更新大模型相关文章&#xff0c;从开发到微调到应用&#xff0c;需要下载好的模型包可私。 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 目…

zdppy_cache缓存框架升级,支持用户级别的缓存隔离,支持超级管理员管理普通用户的缓存

启动服务 import zdppy_api as api import zdppy_cachekey1 "admin" key2 "admin"app api.Api(routes[*zdppy_cache.zdppy_api.cache(key1, key2, api) ])if __name__ __main__:import zdppy_uvicornzdppy_uvicorn.run(app, host"0.0.0.0",…

TEngine框架之HybridCLR代码热更

自HybridCLR热更方案出现以来&#xff0c;像之前的主流toLua/xLua/ILRuntime瞬间不香了&#xff0c;算是跨世代的产物引起业界不小的轰动。HybridCLR是一个特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更新解决方案。想要详细了解HibirdCLR原理和使用的&a…

初爽Stream流

体验Stream流的作用&#xff1a; 需求&#xff1a; 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 要求&#xff1a; 1.把所有以“张”开头的元素存储到新集合中 2.把“张”开头的&#xff0c;长度为3的元素再存储到新集合中 3.遍历打…