今天遇到的case,立此存照。
缘起
今天,深圳部门同事反馈又一件奇事:前不久,可以在jenkins上正常打包的代码,node.js项目,今早,突然就不行了。报错,说我们的jenkins client上没有Python 2环境:
gyp verb `which` failed Error: not found: python2
分析
下面的小伙伴搞不定,就报到我这里来了。先按常规套路,排除了npm源,jenkins节点空间,docker镜像之类的问题。顺着出错log先前看,发现了更有价值的出错信息:
npm info lifecycle node-sass@4.20200618.1~postinstall: node-sass@4.20200618.1
> node-sass@4.20200618.1 postinstall /home/jenkins/workspace/xxx/node_modules/node-sass
> node scripts/build.js
Building: /usr/local/bin/node /home/jenkins/workspace/xxx/node_modules/node-gyp/bin/node-gyp.js rebuild --verbose --libsass_ext= --libsass_cflags= --libsass_ldflags= --libsass_library=
gyp info it worked if it ends with ok
gyp verb cli [ '/usr/local/bin/node',
gyp verb cli '/home/jenkins/workspace/xxx/node_modules/node-gyp/bin/node-gyp.js',
gyp verb cli 'rebuild',
gyp verb cli '--verbose',
gyp verb cli '--libsass_ext=',
gyp verb cli '--libsass_cflags=',
gyp verb cli '--libsass_ldflags=',
gyp verb cli '--libsass_library=' ]
哟,原来是在安装node-sass@4.20200618.1 这个包时出的问题。
对比之前正确时的输出:
[node-sass@4.13.0](mailto:node-sass@4.13.0) postinstall /home/jenkins/workspace/xxx/node_modules/node-sass
原来如彼~
因为4.13的node-sass,我们在编译镜像里预提供了,而最新版本的node-sass,却需要从源码重新编译而导致失败。
解决
接下来的事,就方便解决了。让前端开发的同事,在package.json里,固定好node-sass的版本,不要随便自动升级就好。
package.json
...
# "node-sass": "^4.12.0" 这是之前的样子,要更改为下面一行
"node-sass": "4.13.0"
...
扩展
徒手安装node-sass,本来也是一件要细心和耐心的事,国内用户一般通过设置淘宝的二进制地址解决。
node-sass简介
Sass、Less、Stylus等CSS预处理器的出现大大的提升了CSS的开发速度和代码可读性,相对来说Sass功能更全面、使用的更广泛。
Node-sass是一个库,它将Node.js绑定到LibSass(流行样式表预处理器Sass的C版本)。它允许用户以令人难以置信的速度将.scss文件本地编译为css,并通过连接中间件自动编译。
Sass是一种预处理器脚本语言,可以解释或编译成层叠样式表(CSS)。
Sass包含两种语法:较旧的语法使用缩进将代码块和换行符分隔为单独的规则;较新的语法SCSS使用像CSS这样的块格式。它使用大括号来表示代码块和分号来分隔块中的行。
缩进语法和SCSS文件传统上分别给出扩展名.sass和.scss
知乎上的说法:
node-sass 编译器是通过 C++ 实现的。
在 Node.js 中,采用 gyp 构建工具进行构建 C++ 代码,而 GYP 是基于 Python 2 开发的,所以需要 python,而且不支持 3。
当然,要编译 C++ 还需要一个 C++ 编译器,类似 gcc,不同操作系统下需要的环境也不同,参考官网说明。所以如果你之前没有配置过 node-gyp 构建环境,只装上 python2 还是不行的。
要是觉得配置环境麻烦,node-sass 本身提供对应不同系统的二进制版本,直接重新安装即可。