NODEJS调试一例
最近在使用Node.JS开发一个客户端,第一个大问题是网络速度,访问美国的文件真是慢,很影像效率。
文件下载完成后,使用yarn install命令来落实依赖包时,遇到了一个拦路虎。当yarn调用node-gyp构建sqllite3时出错,信息如图:
从下往上理解报错信息,倒数第二行表明是执行node-gyp rebuild命令时出错了,最后一行cwd指示出的当前目录是vscode-sqllite3,二者结合,是node-gyp在rebuild sqllite3时出错了。
尝试手工切换到这个目录,执行node-gyp rebuild,一切顺利。
再尝试一般,使用yarn install,还是到这里出错。
看来问题有点复杂,搜索一圈,没有找到有效的信息。于是只好自己debug了。看包含stack字样的调用栈,是调用msbuild时出错了,我确实是在用vs 2019来构建windows 版本。
接下来的问题是msbuild为啥出错了?
error
MSB6006那一行应该是显示的MSBUILD的错误信息,但现在是乱码,讨厌啊,为什么是乱码呢?
根据老黄牛多年的经验,估计是和中文有关系。最近几年,微软的多语言部门(i18n)特别勤奋,把本来没有翻译成中文的地方都找出来,鬼子进村一般,地毯式的搜索,一看到有英文的地方都要翻译、翻译、翻译......殊不知,有些东西是没有必要翻译为中文的,翻译过来只能是添乱。比如本来是英文的编译错误信息也被翻译了,真是糟糕。对于大多数程序员来说,英文的错误信息很便于理解,也便于在互联网上找到类似的错误,可以一翻译为中文,全废了,不知所云,想搜索,还要先换为英文,才能搜到有用的信息。
上面的乱码也是翻译成中文后的一个恶果。
怎么半呢?首先想到的是设置MSBuild的语言输出,但是没找到方法,估计注册表或者某个地方可以,但是没有找到指导。
想了一下,有了。改系统的语言吧,进控制面板,把首选语言改为英文。可这个代价挺大的,要log off再log in才有效。
登出,再重新登录,重新执行,有效果了,乱码终于变成人话了。
乱码的问题解决后,信息好懂了,msbuild在执行外部命令时出错了,返回的错误是cmd exited with code 1.
而且cmd.exe还输出了一行错误:c:\Python27 不是有效的内部命令或者外部命令
c:\Python27是目录名,当然不是有效命令了。看来,msbuild在调用python时,python的命令行搞错了。
找到错误原因,问题解决了一半,下一步的任务是找出这个错误的python命令行是哪里来的,如何把正确的传进去。要知道,这里面是要经过好多道手的。
使用记事本打开MSBUILD使用的项目文件,看到里面的命令,果然是错误的:
<Command>call
call c:\Python27 "..\..\deps\extract.py"
"..\..\deps\sqlite-autoconf-3280000.tar.gz"
"$(OutDir)obj\global_intermediate"
if
%errorlevel% neq 0 exit /b %errorlevel%
这个错误信息哪里来的呢?Yarn install的工作大纲是package.json,于是打开package.json来找源头。整个文件有点长,浏览一下,有关的部分是下面这段:
睁大眼睛看action那一行,有点长,但是左边的重要,因为它是决定python路径的,于是便看到了:
process.env.npm_config_python
搜索一下,这个npm_config_python导致过很多问题,github上也有关于它的bug。没有太多时间深究它,当务之急是怎么改变它,于是想到了npm config set命令,即:
npm config set
python c:\Python27\python.exe
运行这个命令会改变当前用户的.npmrc文件,打开一看,果然变了。
再重复一次yarn install,这次问题彻底解决了。